理解JWT(Json Web Token)

  这篇文章写得不错: 理解JWT(JSON Web Token)认证及python实践,这里不做转载,仅摘要如下,有删改,仅做个人学习,感谢原作者。

常用认证机制

1)HTTP basic Auth: client和server之间使用username+“:”+password然后以Base64编码,Base64编码可逆,相当于是明码;

2)OAuth:一个开放网络标准(一个授权框架)即用户要访问服务资源需要提供一个令牌(token):client获得令牌以及用令牌访问资源的过程如下:

(A)客户端向认证服务器申请令牌。
(B)认证服务器对客户端进行认证以后发放令牌。
(C)客户端使用令牌,向资源服务器申请获取资源。
(D)资源服务器确认令牌无误,同意向客户端开放资源。

3) JWT : JWT是Auth0提出的通过对JSON进行加密签名来实现授权验证的方案

  编码之后的JWT是一串字符,由两个点分隔成三段(下面为了方便阅读,在点出做了换行):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

第一部分:头部(header)

json经过Base64加密,解密后内容如下:

#  包括类别(typ)、加密算法(alg);
{
  "alg": "HS256",
  "typ": "JWT"
}

jwt的头部包含两部分信息:

  • 声明类型,这里是jwt

  • 声明加密的算法 通常直接使用 HMAC SHA256

第二部分:载荷(payload)

json经过Base64加密:

载荷就是存放有效信息的地方。这些有效信息包含三个部分:

  • 标准中注册声明

  • 公共的声名

  • 私有的声明

公共的声明 :
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.不建议添加敏感信息。

私有的声明 :
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息。

例子如下:

# 包括需要传递的用户信息;
{ "iss": "Online JWT Builder", 
  "iat": 1416797419, 
  "exp": 1448333419, 
  "aud": "www.gusibi.com", 
  "sub": "uid", 
  "nickname": "goodspeed", 
  "username": "goodspeed", 
  "scopes": [ "admin", "user" ] 
}
  • iss: 该JWT的签发者,是否使用是可选的;

  • sub: 该JWT所面向的用户,是否使用是可选的;

  • aud: 接收该JWT的一方,是否使用是可选的;

  • exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的;

  • iat(issued at): 在什么时候签发的(UNIX时间),是否使用是可选的;

第三部分:签名(signature)

将头部和载荷经过Base64编码后的字符通过点拼接,拼接后的字符串使用HS256算法加密,加密时使用一个私有密钥,

这个密钥只存在服务端,最终得到一个签名。

  三个部分拼接在一起,就是完整的Json Web Token了。python中使用 pyjwt 包来生成token以及校验token

posted @ 2018-03-08 08:17  tlz888  阅读(146)  评论(0编辑  收藏  举报