视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JWT原理和简单应用的介绍(附代码)
2020-11-27 14:20:22 责编:小采
文档


本篇文章给大家带来的内容是关于JWT原理和简单应用的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

JWT认证登录

最近在做一个审核系统,后台登录用到JWT登录认证,在此主要做个总结

JWT是什么

Json web token (JWT), 根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

为什么使用JWT

此处主要和传统的session作对比,传统的session在服务器端需要保存一些登录信息,通常是在内存中,在后端服务器是集群等分布式的情况下,其他主机没有保存这些信息,所以都需要通过一个固定的主机进行验证,如果用户量大,在认证这个点上容易形成瓶颈,是应用不易拓展。

JWT原理

JWT由三个部分组成,用点号分割,看起来像是这样,JWT token本身没有空格换行等,下面是为了美观处理了下

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19.
m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
1.头部(Header)

Header部分是一个json,描述JWT的元数据,通常是下面这样

{
 "alg": "HS256",
 "typ": "JWT"
}

alg表示签名使用的的算法,默认是HMAC SHA256,写成HS256, tye表示这个token的类型,JWT token统一使用JWT,上面这段Header生成的token是

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2.负载(Payload)

官方规定了7个字段,解释如下

  • iss: 签发人,可以填写生成这个token的ID等等,可选参数
  • sub: 该JWT所面向的客户,可以存储用户的account_id等等,可选
  • aud:该JWTtoken的接收方,可以填写生成这个token的接口URL,但是不强制,可选
  • exp: 过期时间,时间戳,整数,可选参数
  • iat:生成token的时间,unix时间,时间戳,可选参数
  • nbf(Not Before): 表示该token在此时间前不可用,验证不通过的意思,可选
  • jti: JWT ID,主要用来生成一次性token,可选的参数
  • 除了官方之外,我们还可以定义一部分自定义字段,但是考虑到BASE是可逆的,所以不要放入敏感信息
    下面是一个例子;

    {
     "iss": "labs_purifier-api-panel",
     "iat": 1552975878,
     "exp": 1555567878,
     "aud": "http://ff-labs_purifier-api-test.fenda.io/prod/v1/auth/jwt",
     "sub": "1501385611884704",
     "scopes": [
     "register",
     "open",
     "login",
     "panel"
     ]
    }

    上面这个Payload,经过BASE加密后,生成的token是

    eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
    3.签名(Signature)

    Signature是对前面两部分生成的两段token的加密,使用的加密方式是Header里面指定的,此处是HS256,此时,需要一个秘钥,不可以泄露,大致过程如下:

    HMACSHA256(
     baseUrlEncode(header) + "." +
     baseUrlEncode(payload),
     secret)

    JWT的使用

    JWT token 一般放在请求头里面,当然也可以放在cookie里面,但是放在cookie里面不可以跨域,例如:

    Authorization: Bearer <token>

    JWT在Python中的简单生成和验证

    jwt库

    生成token

    def create_token():
     payload={
     "iss": "labs_purifier-api-panel",
     "iat": 1552975878,
     "exp": 1555567878,
     "aud": Config.AUDIENCE,
     "sub": "1501385611884704",
     "scopes": [
     "register",
     "open",
     "login",
     "panel"
     ]
     }
     token = jwt.encode(payload, Config.SECRET_KEY, algorithm='HS256')
     return True, {'access_token': token}

    验证token

    def verify_jwt_token(token):
     try:
     payload = jwt.decode(token, Config.SECRET_KEY,
     audience=Config.AUDIENCE,
     algorithms=['HS256'])
     except (ExpiredSignatureError, DecodeError):
     return False, token
     if payload:
     return True, jwt_model

    需要注意的是,如果在生成的时候,加上了aud参数,验证的时候也要用上audience参数,并且值必须一样

    本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的python视频教程栏目!

    下载本文
    显示全文
    专题