自行实现 API 请求认证
程序员文章站
2022-06-19 11:53:41
在 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
上一篇: 在百度中查询网站目录的收录情况的方法
下一篇: 既然外链影响网站权重 那是不是越多越好
推荐阅读
-
详解Laravel5.6 Passport实现Api接口认证
-
python实现rest请求api示例
-
vue实现的请求服务器端API接口示例
-
spring boot 2 集成JWT实现api接口认证
-
PHP如何使用JWT做Api接口身份认证的实现
-
基于Moya、RxSwift和ObjectMapper优雅实现REST API请求
-
基于Laravel Auth自定义接口API用户认证的实现方法
-
Identity4实现服务端+api资源控制+客户端请求
-
Laravel5.4简单实现app接口Api Token认证方法
-
IdentityServer4实现.Net Core API接口权限认证(快速入门)