欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

自行实现 API 请求认证

程序员文章站 2022-03-06 15:59:21
在 HTTP 的 API 请求,作为后台服务需要知道请求者是谁,当然对 Django 项目有好多现成的解决方案 DRF token 和 JWT token 等,现在咱们说一种土方法。class Token(object): def __init__(self, user, passwd): self.user = user self.passwd = passwd def get_token(self): # 1. 用随机值...

在 HTTP 的 API 请求,作为后台服务需要知道请求者是谁,当然对 Django 项目有好多现成的解决方案 DRF token 和 JWT token 等,现在咱们说一种土方法。

class Token(object):
   def __init__(self, user, passwd):
        self.user = user
        self.passwd = passwd
         
    def get_token(self):
        # 1. 用随机值和时间戳来区分请求和保证安全
        self.rdm_str = ''.join(random.sample('abcdefghij123456789', 5))
        self.time = int(time.time())
        # 2. 加上用户的 passwd
        token_str_list = [self.passwd, self.rdm_str, str(self.time)]
        token_str_list.sort()
        token_str = ''.join(token_str_list)
        m1 = md5.new()
        m1.update(token_str)
        # 3. 生成 hash 值,注意 hash 值中隐含 用户密码 的信息,并没有原生的体现密码
        self.token = m1.hexdigest()
        return self.token

发送请求:

# USER_NAME 和 PASSWORD  是由服务端分发的
# 把 token 和 生成 token 的原始数据放到请求的 URL 上,
# 后端在收到请求后,从 URL 中解析出 token 和 生成 token 的原始数据 和 根据请求体中的用户名得到该用户的密码
# 最后根据 get_token 中的方法重新计算下 token,然后和请求 URL 中携带的 token 比较
token_obj = Token(USER_NAME, PASSWROD)    
req_url = "http://192.168.0.1/getFlowData/?reqTime=%s&reqToken=%s&reqRandom=%s" % \
           (token_obj.time, token_obj.get_token(), token_obj.rdm_str)
           
post_data = {'username': USERNAME, 'flowNo': self.flow_num}
url_encode = urllib.urlencode(post_data)
req = urllib2.Request(url=req_url, data=url_encode)
res_data = urllib2.urlopen(req)
res = res_data.read()
data_set = json.loads(res)

改进版:替换上面的用户名和密码,可以用 app_name 和 该 app 对应的盐值,同时把生成 token 的原始和 token 信息放到请求头里而不是放到请求的 URL 里面。而计算 token 的方法就变成了:

# parms_dict 包括:当前时间,随机字符串,app_name,盐值
some_param = ["{0}={1}".format(k, v) for k, v in param_dict.iteritems()]

# headers 包括:当前时间,随机字符串,app_name 和根据 parms_dict  计算得到的 token
# 后端服务会根据请求头中的 app_name 查库得到盐值,
# 然后按照同样的算法计算 token,然后和请求头里的 token 比对
# 所以要保证 parms_dict  和 headers 中的 当前时间,随机字符串,app_name 的值是一样的
headers['token'] = hashlib.sha1("&".join(some_param).encode()).hexdigest()

本文地址:https://blog.csdn.net/cpxsxn/article/details/107641263

相关标签: Django # auth