【墙裂推荐】Token的生成和校验

简介: 【墙裂推荐】Token的生成和校验

什么是 token


token(也称令牌)就是一串字符,其作用是为了减轻频繁进行用户名和密码的验证而对服务器产生的压力。客户端首次访问通过正确的用户名和密码从服务端拿到 token,之后客户端携带 token 即可完成验证,无需重复携带用户名和密码。


JWT


JWT 全名 json web token,它是一种开放的标准,其带有数字签名,用于 json 对象的安全传输。


怎么生成 token


我们已经知道 token 是一串字符,我们可以通过一些秘钥+用户名+时间戳等字符组合,使用 base64 对其进行加密,从而生成 token 颁发给客户端。然后对客户端携带的 token 进行解密,拿到秘钥,用户名,时间戳,最后对这些参数进行校验就可以判断 token 正确与否和是否过期。


以上为 token 生成的原理,在实际开发中,我们可以直接使用现成的第三方库(如:python-jose)。


常用的 JWT 库


  • python-jose
  • pyjwt
  • jwcrypto
  • authlib


安装 JWT 库


pip install python-jose
复制代码


生成 token


# 从jose导入jwt,后面使用jwt生成token
from jose import jwt
# 导入日期模块,用来验证token过期时间
from datetime import datetime,timedelta
# 定义秘钥,很重要,请勿泄露
SECRET_KEY = 'phyger'
# 生成token的代码,token过期时长定义为默认参数,单位为秒
def create_token(seconds=60):
    # 定义token过期时间,为当前utc时间加上token有效期
    expire = datetime.utcnow()+timedelta(seconds=seconds)
    # 此处即为生成token的payload,sub自定义(可选用户名),uid自定义(可选设备id等)
    # to_endoe可以是一个空的字典,但是不建议这样做
    to_encode = {"exp":expire,"sub":SECRET_KEY,"uid":"123456"}
    # 使用jwt生成token,token是根据payload和秘钥共同生成。
    jwt_token = jwt.encode(claims=to_encode,key=SECRET_KEY)
    return jwt_token
复制代码


joseJWT 默认采用 HS256 加密方式。


运行代码


> python utm.py
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTI1MjY0OTgsInN1YiI6InBoeWdlciIsInVpZCI6IjEyMzQ1NiJ9.TnRFBFX_2Jn3VU26n603l5uOQyB9bOOWSxBQUr6tBA4
复制代码


可以看到,token 已经生成。


上面,我们已经介绍了 token 的生成,是直接使用的第三方库 jose,当然 jose 可以生成 token,想必他也可以校验 token 了。


token 校验


代码


from jose import jwt
# 导入token校验的两种异常,一种是token超时异常,一种是token错误异常
from jose.exceptions import ExpiredSignatureError, JWTError
def judge_token(token):
    # 尝试解密,解密成功后,秘钥,payload,有效时长校验通过,则会返回payload
    try:
        payload = jwt.decode(token,SECRET_KEY)
        print(payload)
        return True
    # 否则,则捕获异常,进行提示
    except ExpiredSignatureError as e:
        print('token过期了!')
        return False
    except JWTError as e:
        print('token验证失败!')
        return False
复制代码


按照传统的 jwt 协议,我们需要解密 token 后,对 token 的秘钥,payload,有效时长进行单独的校验。以上,token 的秘钥,payload,有效时长,jose 都帮我们完成了,我们只需要调用 jose.jwtencodedeode 就可以完成加解密。


执行校验


if __name__ == "__main__":
    tk=create_token()
    print(tk)
    res1=judge_token(tk)
    print(res1)
    import time
    time.sleep(60)
    res2=judge_token(tk)
    print(res2)
复制代码


执行结果


> python utm.py
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTI1Mjg0MzYsInN1YiI6InBoeWdlciIsInVpZCI6IjEyMzQ1NiJ9.yVhoAKyZFvQi3q4wqd1JoRondl9A6wUaALueP00oyhc
{'exp': 1612528436, 'sub': 'phyger', 'uid': '123456'}
True
token过期了!
False```
> 因为默认token的有效期为60秒,我们在第二次校验token前睡眠了61秒,所以第二次的校验结果为过期!
**使用错误的token校验**
```python
if __name__ == "__main__":
    res=judge_token('phyger666')
    print(res)
复制代码


网络异常,图片无法展示
|


以上就是本篇的全部内容了,感谢您的阅读,我们再会。

相关文章
|
4月前
|
安全 API 开发者
惊!Python开发者必看:OAuth与JWT授权机制的惊天秘密😱
【8月更文挑战第4天】在现代软件开发中,尤其在Web和移动应用领域,用户认证与授权至关重要。对Python开发者来说,OAuth与JWT是两大利器,能显著提高应用的安全性并优化用户体验。OAuth通过“授权而非认证”的理念,安全地让用户授予第三方应用访问权限;JWT则是一种自包含的令牌格式,确保信息的安全传输。二者结合使用,可以构建坚固的认证体系。掌握这些核心技术,让您的应用更安全、更高效。
39 1
|
5月前
|
存储 JSON 安全
Token验证技术文档
【7月更文挑战第6天】Token验证是现代Web应用中常见的安全措施,用于确保用户身份的合法性和请求的安全性。它基于令牌(Token)的概念,通过在客户端和服务端之间传递一个安全的、有时限的字符串来验证用户身份,替代传统的基于会话的认证机制。本文档旨在介绍一种基本的Token验证流程,并提供一个简单的代码示例,使用JSON Web Tokens (JWT) 实现这一过程。
640 1
|
4月前
|
前端开发 算法 Serverless
中后台前端开发问题之保证用户的token等信息的唯一性和不可伪造性如何解决
中后台前端开发问题之保证用户的token等信息的唯一性和不可伪造性如何解决
54 0
|
4月前
|
存储 JSON 安全
在项目中到底应不应该用jwt?
JSON Web Tokens(JWT)是一种开放标准,用于在网络上传输安全信息。它常用于身份验证场景,用户登录后,服务器生成JWT并返回给客户端。客户端在后续请求中携带此令牌,服务器验证其有效性来确认用户身份。JWT具有无状态、可扩展和安全的特点,支持跨域认证,但也有令牌大小、续期复杂等缺点。是否使用JWT取决于项目需求,多数公司在采用,除非有特殊理由避免。以下是Go语言中使用JWT的一个示例。
85 0
|
5月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
5月前
|
存储 JavaScript 前端开发
文本,三步走构思,富文本点击提交能够存储到数据库当中(下),最快的方法,还是会看资料,因此会整合资料最好,直接看资料最快,因为是JWT的资料,我们要设置好登录的内容,看登录的地方怎样写的
文本,三步走构思,富文本点击提交能够存储到数据库当中(下),最快的方法,还是会看资料,因此会整合资料最好,直接看资料最快,因为是JWT的资料,我们要设置好登录的内容,看登录的地方怎样写的
|
7月前
|
存储 SQL 安全
使用 BurpSuite 基于 Token 机制实施
使用 BurpSuite 基于 Token 机制实施
使用 BurpSuite 基于 Token 机制实施
|
7月前
|
前端开发 JavaScript PHP
fastadmin框架自带的数据效验
fastadmin框架自带的数据效验
275 0
|
安全
BurpSuite进阶篇--自动识别Token值
BurpSuite进阶篇--自动识别Token值
496 0
BurpSuite进阶篇--自动识别Token值
|
存储 前端开发 API
还在直接用localStorage么?全网最细:本地存储二次封装(含加密、解密、过期处理)
很多人在用 localStorage 或 sessionStorage 的时候喜欢直接用,明文存储,直接将信息暴露在;浏览器中,虽然一般场景下都能应付得了且简单粗暴,但特殊需求情况下,比如设置定时功能,就不能实现。就需要对其进行二次封装,为了在使用上增加些安全感,那加密也必然是少不了的了。为方便项目使用,特对常规操作进行封装。
650 1
还在直接用localStorage么?全网最细:本地存储二次封装(含加密、解密、过期处理)

热门文章

最新文章