在各种前后端分离的项目里, 被广泛应用那是一种JSON的行业标准JWT, 作为一种能够用来开发web后端的语言, 也能够运用JWT认证, 那么在之中怎么去使用JWT, 来瞧瞧关于这篇JWT介绍与使用有着详细解说的内容。
1. JWT 介绍
JSON Web即一种称作jwt的开发行业标准RFC 7519, 它被用于安全地表示双方之间的声明, 当前, jwt在系统的用户认证方面应用广泛, 尤其是在前后端分离项目之中。
jwt认证流程:
在项目开展过程当中, 通常会依照上图所呈现的流程来实施认证, 也就是说, 当用户使得登录得以成功达成之后, 服务端会针对用户浏览器回馈返回一个token, 往后用户浏览器需要携带着token再次前往服务端去发送请求, 服务端还会对token的合法性予以校验, 要是合法的情况就会把数据展示给用户, 不符合此番状况, 亦即不保持合法一致, 那么就会返回一些错误信息。
传统token方式和jwt在认证方面有什么差异?
2. JWT 创建 .1 JWT 生成原理
jwt所生成的token格式是依此呈现的, 也就是说, 它是经由.进行连接的三段字符串而构成的。
.
DIyfQ.w5c
生成规则如下:
第一段之中的部分, 固定存有算法以及token类型,针对此json予以加密, 这般便成为了token。
的第一段
{ "alg": "HS256", "typ": "JWT" }第二部, 分内容, 含有一些数据, 针对此json予以加密, 这便是token的第二段。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 ... }处于第三段的那部分, 将前两段的密文, 借助某种方式拼接起来, 之后针对拼接好的内容实施HS256加密, 紧接着又对经过HS256加密后的密文, 再去进行加密操作, 最终才得以获取到token的第三段。
base64url( HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret (秘钥加盐) ) )把三段字符串, 借助., 进行拼接, 如此一来, 有了 jwt 的 token 被生成。
要留意, 加密的做法是, 先去进行加密这个操作, 之后呢, 再把其中的 - 用来替换 + , 以及把 _ 用来替换 /。
2.2 JWT 校验 token 原理
通常于认证成功之后, 将由 jwt 所生成的 token 返回给用户, 往后每当用户再度进行访问之际, 都需要携带该 token, 而在此种情况下 jwt 要针对 token 做超时以及合法性的校验。
获取 token 之后,会按照以下步骤进行校验:
将token分割成 、 、 三部分
JWT_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" signing_input, crypto_segment = JWT_TOKEN.rsplit('.', 1) header_segment, payload_segment = signing_input.split('.', 1)对第一部分 进行 解密,得到
对第二部分 进行 解密,得到
致使第三部分, 予以解密, 从而获取, 针对部分数据, 开展合法性校验。
3. 代码实现
基于 的 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 时间
时间将会是相对于协调世界时(由(.(.()))给出的), 所以一定要使用协调世界时或者以处于一种状态时在其中的方式来使用它然后确保使用它。
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, 在程序进行解密该dic的这个行为之际, 程序会依据key自身所对应的Value来判定其是否具备合法性, 像这些key, 具体有:
“exp”, 于生成token之际, 能够设定该token的有效时间, 要是我们设定为1天过期, 待1天过后, 我们再对这个token进行解析之时将会抛出。
jwt..r: has
"nbf", 它所指代的是该token的生效时间, 要是使用了然而却还没到生效时间, 那么便会抛出:
“iss”, 它是token的签发者, 针对这个签发者我们能够赋予它一个字符串的值, 需要注意, 倘若“iss”在接收过来的时候不进行检验, 这种情况其实也不存在什么问题, 要是当我们接收它的时候需要实施检验这个动作, 然而却出现签名不一致的状况, 那么此时便将会抛出。
jwt..:
“aud”, 它指定了接收者, 接收者在接收这个的时候, 必须要去提供与token要求的那个呈现一致的接收者, 也就是字符串, 要是没有写接收者, 或者接收者并不一致, 那么就会抛出。
jwt..:
“iat”, 它属于token的开始时间, 要是当前时间处于开始时间的前面, 那么就会抛出。
JWT, 在声明(签发时间)方面, 处于那个之中。
4.2 PyJWT 官方文档
至此, 关于JWT介绍以及使用详解的这篇文章便介绍到这儿了, 更多和JWT相关的文章, 能够关注以往的文章, 或者继续浏览下面的相关文章, 期望大家今后大力支持!