Token可以理解为一种特殊的加密密码或者暗号;只有暗号匹配才能通过,否则就是“敌人”;
我们在登录XX站点,XX系统都需要输入自己的用户名和密码;但是在接口调用过程中,为了账号加密安全性,不能明文将账号密码放入到请求体或请求头中;
所以需要一种加密方式—暗号,这种暗号格式可以自己定义,那么只有“自己人”知道;
从而达到加密安全调用和请求对方接口;
1、正常输入账号密码的请求过程:
1)登录页面登录后,服务端会生成token返回给客户端并缓存;
2)后续操作业务页面,会默认带上缓存的token;从而能对上暗号,实现正常的请求;
2、调用接口直接请求服务端,可以使用2中方法:
1)调用登录接口后,获得返回的token,在后续请求头或者url中带上token;
2)知道加密盐后,生成token,在接口请求中带上生成的token;
Token的格式可以自行约定,如下就是一个较简单的Token
{
"iss": "明源应用",
"iat": 1702275113,
"jti": "0AC3291A-88E9-017D-DF00-9CE0ECC29446",
"u": "admin",
"c": "",
"a": "Mysoft",
"t": "ompseyddyfyz"
}
Token为了安全性,一次生成的token只能使用一次,下次使用需要按照规则重新生成;所以在以上的token中加入了时间戳(iat)和 uuid(jti);
时间戳:是为了限制token有效期
uuid:是为了限制token使用次数,如果两次请求的id相同,那么服务端就会自动判断token无效;
所以我们自己要封装token,基于以上这个案例,我们需要每次动态生成时间戳和uuid
如下是python代码实现的基于jwt的token封装:
token分为三部分:data(数据)、secret(盐)、algorithm(加密方式)
分四步实现:
1、准备data
2、替换时间戳和uuid
3、准备加盐,此为实现服务端约定好的秘钥
4、加密生成最终token
# jwt生成token
def newToken(tenantName):
# 1、token格式模板
ds = '{"iss": "明源应用","iat": 1702275113,"jti": "0AC3291A-88E9-017D-DF00-9CE0ECC29446","u": "admin","c": "","a": "Mysoft","t": "ompseyddyfyz"}'
payload = json.loads(ds) # 转换为json
timestamp = time.time() # 生成时间戳
timestamp = round(timestamp)
guid = uuid.uuid4() # 生成guid
# print(guid)
# 2、替换模板中的值
payload['iat'] = timestamp # 修改时间戳
payload['jti'] = str(guid) # 修改随机guid
payload['t'] = tenantName # 修改租户
# print(payload)
# print(type(payload))
# payload = json.dumps(data)
# 3、加盐
secret = 'ff483a6526ddf275'
# 4、加密生成token
token = jwt.encode(payload, secret, algorithm='HS256')
# print(token)
# Authorization = 'Bearer '+token
return token