提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、Token是什么?
在计算机身份认证中是令牌(临时),在我的认知里面,token类似于打开后端的钥匙,在你登录之后,后端给你一串钥匙,你可以根据这串钥匙访问后端一些上锁的地方,如果没上锁,就是公共访问区域,没有token也能访问,有些地方上锁了你没钥匙,就是你的token里没有给你相对应的权限钥匙。
二、使用步骤
首先是创建一个token_core类。
1.引入库并配置token
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer#导入
'''
这里的token_config.SECRET_KEY其实就是一段任意字符串
而expires_in是token的过期时间已秒为时间单位
'''
t = Serializer(token_config.SECRET_KEY, expires_in=2592000)#配置token
2.登录返回token
'''
登录产生token,参数根据自己需求添加,我这里只添加了用户名,其余暂定为空。
token本身应该还要包含角色权限
我这里是将token保存到redis数据库中
错误代码自定义
'''
#登录产生token
def login_token(userphone):
user = {
"userPhone": userphone,
'userPermission': '',
'userRole': '',
}
#存入redis
try:
//这里其实就是redis的hset 不过我因需求加了一重判断,所以封装成新的方法
redisHset(n = userphone,k="token_userinfo",v=json.dumps(user))
except:
//output就是封装好的response
return output( msg='token产生错误',code="20003")
return t.dumps(user).decode('utf-8')
3.请求验证token的装饰器
#验证token是否登录
def login_required(func):
@wraps(func)
def verify_token(*args,**kwargs):
try:
#前端需要把token放在请求的header里面,然后后端在请求头上拿到token
token = request.headers["userToken"]
except Exception:
#获取不到就返回 token空错误
return output(msg = 'token为空',code="20001")
#解析token,若token解析成功但是时间过期了则返回token过期
try:
a = t.loads(token)
except Exception:
return output(msg = "token已经过期",code="20002")
#解析token成功且未过期,则验证是否存在redis内,若存在则允许执行,否则返回非法访问
#get_userinfo是我再封装的redis的get方法
if get_userinfo(a['userPhone'],'token_userinfo') is None:
return output(msg="非法访问",code='20004')
return func(*args,**kwargs)
return verify_token
总结
这里只是简单的token获取和验证,后面还需要有权限的验证等