当前位置: 移动技术网 > IT编程>开发语言>.net > 自行实现 API 请求认证

自行实现 API 请求认证

2020年07月29日  | 移动技术网IT编程  | 我要评论
在 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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网