django JWT认证(一)

什么是JWT

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

什么时候使用JWT

我们在什么时候使用JWT呢,通常情况下JWT用于前后端分离的用户认证(Authentication),后续用户每次请求都在请求上包含JWT,允许用户请求访问相关资源。单点登录(SSO),是目前广泛使用的JWT的一项功能。JWT是一种无状态请求,它不需要在服务端保留用户的认证信息或会话信息,一个是为了安全,同时也为应用提供扩展提供了便利。

请求流程

  • 用户使用原始账户进行登录认证
  • 服务器验证用户认证信息
  • 认证通过后返回一个token一用户
  • 客户端存储token,并在每一个请求上附带这个token ,一般会附加到header请求头中
  • 服务器验证token,验证通过即返回数据

JWT结构

  • Header(头部信息)
  • Payload(请求载荷)
  • Signature(签名)

通常看起来像这样

1
xxxxx.yyyyy.zzzzz

例子:

1
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

解码JWT可以通过https://jwt.io 进行解码

HEADER:

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

将以上数据进行base64加密得到第一部分

PAYLOAD:

1
2
3
4
5
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}

将以上数据进行base64加密得到第二部分

SIGNATURE:

1
2
3
4
5
6
7
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),

your-256-bit-secret //这里的secret 就是django settings.py 中的 SECRET_KEY 所有这个特别重要

)

SECRET_KEY一定要保存好,如果流出去就会意味者客户端可以自我生成jwt

签名由三部分组成:

  • header (base64后的)
  • payload (base64后的)
  • secret

如何使用

在用户请求头上加上以下参数

1
Authorization: Bearer <token> //该token由服务端返回

安全提示

1.由于JWT里面的信息可以解码出来的,基本上任何人都可以阅读(除非有额外加密),否则不要在JWT中放入重要的信息。
2.保存好你的secret