JwtBearer认证
阅读数:90 评论数:0
跳转到新版页面分类
python/Java
正文
一、JWT
JWT(JSON Web Token)是一种基于JSON的开放标准(RFC 7519),用于创建在各方之间安全传输信息的令牌。JWT通常用于身份验证和信息交换,特别是在Web应用程序中。
JWT的原理是,服务器认证以后,生成一个JSON对象,发回给用户,用户与服务端通信都要携带这个JSON对象。
为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
JWT由三个部分组成,它们之间由点(.
)分隔:
- Header(头部)
- Payload(负载)
- Signature(签名)
1、Header
header典型由两部分组成:token的类型和算法名称。
{
"alg": "HS256", //alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256)
"typ": "JWT" //typ属性表示这个令牌(token)的类型(type)
}
这个JSON结构会被Base64Url编码,形成JWT的第一部分。
2、Payload
Payload部分包含所谓的claims(声明)。Claims是关于实体(通常是用户)和其他数据的声明。有三种类型的claims:registered(注册的),public(公共的)和private(私有的)。
- Registered claims:这些是预定义的声明,不是必须的,但是推荐使用。例如:iss(发行者)、exp(过期时间戳)、sub(主题)、aud(观众)。
- Public claims:可以随意定义,但为了避免冲突,它们应该在IANA JSON Web Token Registry中注册,或者包含一个命名空间以避免冲突。
- Private claims:是发送方和接收方之间共同商定的声明。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
这个JSON结构也会被Base64Url编码,形成JWT的第二部分。
JWT规定了七个官方字段
(1)iss (issuer):签发人
(2)exp (expiration time):过期时间
(3)sub (subject):主题
(4)aud (audience):受众
(5)nbf (Not Before):生效时间
(6)iat (Issued At):签发时间
(7)jti (JWT ID):编号
另外,还可以定义私有字段。
3、Signature
Signature 部分是对前两部分的签名,防止数据篡改。
为了创建签名部分,你必须使用编码后的header和payload,以及一个密钥,使用header中指定的算法进行签名。
例如,如果要使用HMAC SHA256算法:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用于验证消息在途中没有被改变,并且,对于使用私钥签名的令牌,它还可以验证JWT的发送方是谁。
4、JWT的使用流程
- 用户认证:用户通过用户名和密码登录系统。
- 生成JWT:认证服务器验证用户的凭据,如果有效,它将创建一个JWT,并将其返回给用户。
- 客户端存储JWT:客户端应用程序存储JWT,通常是在cookie或localStorage中。
- 发送JWT:客户端在随后的请求中发送JWT,通常是在HTTP头的Authorization字段中带Bearer标记。
- 服务器验证JWT:服务器验证JWT的签名,以确保它的有效性,并从中提取用户信息和权限,进行相应的操作。
- JWT过期:JWT通常会有一个过期时间,在此时间后将不再有效。用户需要重新认证以获取新的JWT。
5、安全注意事项
- 应当确保HTTPS用于客户端和服务器之间的所有通信,以防止中间人攻击。
- 不要在JWT中存储敏感信息,因为Base64编码是可逆的,除非它被加密。
- 应当为JWT设置合理的过期时间,以减少令牌被盗用的风险。
- 保护好签名密钥,特别是使用对称加密算法时,因为任何知道密钥的人都可以生成有效的JWT。
二、Bearer认证
Bearer验证属于HTTP协议标准验证,详细定义见RFC6570
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
Bearer认证的核心是Token,它的颁发和验证完全由我们自己的应用程序来控制,而不依赖于系统和Web服务器,Bearer验证的标准请求方式如下:
Authorization: Bearer [BEARER_TOKEN]