jwt怎么使用? jwt生成原理是啥?
发布时间:2022-03-15 16:44:19 所属栏目:语言 来源:互联网
导读:本文主要给大家介绍的是关于 JWT的内容,一些新手对于 JWT是什么以及jwt怎么使用不是很清楚,下面给大家分享基于Python的 JWT使用,感兴趣的朋友可以了解了解。 1. JWT 介绍 jwt( JSON Web Tokens ),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方
本文主要给大家介绍的是关于 JWT的内容,一些新手对于 JWT是什么以及jwt怎么使用不是很清楚,下面给大家分享基于Python的 JWT使用,感兴趣的朋友可以了解了解。 1. JWT 介绍 jwt( JSON Web Tokens ),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明。目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目 jwt认证流程: 在项目开发中,一般会按照上图所示的过程进行认证,即:用户登录成功之后,服务端给用户浏览器返回一个 token,以后用户浏览器要携带 token 再去向服务端发送请求,服务端校验 token 的合法性,合法则给用户看数据,否则,返回一些错误信息 传统token方式和jwt在认证方面有什么差异? 传统 token 方式:用户登录成功后,服务端生成一个随机 token 给用户,并且在服务端(数据库或缓存)中保存一份 token,以后用户再来访问时需携带 token,服务端接收到 token 之后,去数据库或缓存中进行校验 token 的是否超时、是否合法 jwt 方式:用户登录成功后,服务端通过 jwt 生成一个随机 token 给用户(服务端无需保留 token),以后用户再来访问时需携带token,服务端接收到 token 之后,通过 jwt 对 token 进行校验是否超时、是否合法 2. JWT 创建 token 2.1 JWT 生成原理 jwt 的生成 token 格式如下,即:由 . 连接的三段字符串组成 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lI iwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 生成规则如下: 第一段 HEADER 部分,固定包含算法和 token 类型,对此 json 进行 base64url 加密,这就是 token的第一段 { "alg": "HS256", "typ": "JWT" } 第二段 PAYLOAD 部分,包含一些数据,对此json进行base64url加密,这就是token的第二段 { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 ... } 第三段 SIGNATURE 部分,把前两段的 base64url 密文通过. 拼接起来,然后对其进行 HS256 加密,再然后对hs256 密文进行 base64url 加密,最终得到 token 的第三段 base64url( HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret (秘钥加盐) ) ) 最后将三段字符串通过 . 拼接起来就生成了 jwt 的 token 注意:base64url 加密是先做 base64 加密,然后再将 - 替代 + 及 _ 替代 / 2.2 JWT 校验 token 原理 一般在认证成功后,把 jwt 生成的 token 返回给用户,以后用户再次访问时候需要携带 token,此时 jwt 需要对token 进行超时及合法性校验 获取 token 之后,会按照以下步骤进行校验: 将token分割成 header_segment 、payload_segment 、crypto_segment 三部分 JWT_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" signing_input, crypto_segment = JWT_TOKEN.rsplit('.', 1) header_segment, payload_segment = signing_input.split('.', 1) 对第一部分header_segment 进行 base64url 解密,得到 header 对第二部分payload_segment 进行 base64url 解密,得到 payload 对第三部分crypto_segment 进行 base64url 解密,得到 signature,针对 signature 部分数据进行合法性校验 拼接前两段密文,即:signing_input 从第一段明文中获取加密算法,默认:HS256 使用算法+盐 对 signing_input 进行加密,将得到的结果和 signature 密文进行比较 3. 代码实现 基于 Python 的 pyjwt 模块创建 jwt 的 token 安装 pip3 install pyjwt 实现 from datetime import datetime, timedelta import jwt class JwtToken(object): _salt = "@^4_00wedv**pi)+(!w1rwi=d3q4l=ie=g-u$s8jevmj*zgg2h" _expire_message = dict(code=1200, msg="token 已经失效") _unknown_error_message = dict(code=4200, msg="token 解析失败") @classmethod def generate_token(cls, payload: dict) -> str: headers = dict(typ="jwt", alg="HS256") resut = jwt.encode(payload=payload, key=cls._salt, algorithm="HS256", headers=headers) return resut @classmethod def parse_token(cls, token: str) -> tuple: verify_status = False try: payload_data = jwt.decode(token, cls._salt, algorithms=['HS256']) verify_status = True except jwt.ExpiredSignatureError: payload_data = cls._expire_message except Exception as _err: payload_data = cls._unknown_error_message return verify_status, payload_data if __name__ == '__main__': TEST_DATA = dict(name="mooor", exp=datetime.utcnow() - timedelta(seconds=1)) token = JwtToken.generate_token(TEST_DATA) print(token) payload = JwtToken.parse_token(token) print(payload) 注意:exp 务必选择 UTC 时间 Expiration time will be compared to the current UTC time (as given by timegm(datetime.utcnow().utctimetuple())), so be sure to use a UTC timestamp or datetime in encoding 4. 参数介绍 4.1 示例: import jwt import datetime dic = { 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1), # 过期时间 'iat': datetime.datetime.utcnow(), # 开始时间 'iss': 'ChaosMoor', # 签名 'data': { # 内容,一般存放该用户id和开始时间 'a': 1, 'b': 2, }, } token = jwt.encode(dic, 'secret', algorithm='HS256') # 加密生成字符串 print(token) payload = jwt.decode(token, 'secret', issuer='lianzong', algorithms=['HS256']) # 解密,校验签名 print(s) print(type(s)) dic 有官方指定的 key,程序在解密的时候会根据 key 的 Value 判断是否合法。这些 key 有: "exp":在生成 token 时,可以设置该 token 的有效时间,如果我们设置 1 天过期,1 天后我们再解析此 token 会抛出 jwt.exceptions.ExpiredSignatureError: Signature has expired "nbf":它指的是该 token 的生效时间,如果使用但是没到生效时间则抛出: jwt.exceptions.ImmatureSignatureError: The token is not yet valid (nbf) "iss": token 的签发者,我们可以给他一个字符串,注意,iss 在接收时如果不检验也没有问题,如果我们接收时需要检验但是又签名不一致,则会抛出 jwt.exceptions.InvalidIssuerError: Invalid issuer "aud":指定了接收者,接收者在接收时必须提供与 token 要求的一致的接收者(字符串),如果没写接收者或者接收者不一致会抛出 jwt.exceptions.InvalidAudienceError: Invalid audience "iat":token 的开始时间,如果当前时间在开始时间之前则抛出 jwt.exceptions.InvalidIssuedAtError: Issued At claim (iat) cannot be in the future. (编辑:濮阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |