JWT是什么?
JWT(JSONWebToken)它是一个开放的标准(RFC7519),它定义了一种紧凑而独立的方式,可以安全地传输JSON作为各种系统之间的对象,并确保传输的信息不会被篡改。
JWT通常有两种应用场景:
- 授权。这是JWT最常见的使用场景。一旦用户登录,每个后续请求将包含一个JWT,作为用户访问资源的令牌。
- 信息交换。JWT可以安全地将信息传输到每个系统之间,JWT的特性允许接收者验证接收到的内容是否被篡改。
本文讨论了如何利用JWT实现API授权访问的第一点。这样,只有授权用户才能调用API。
JWT的结构
JWT由三部分组成,用.分开。
Header
第一部分是Header,通常由两部分组成:令牌类型,即JWT,以及使用的加密算法。
{ "alg": "HS256", "typ": "JWT"}
Base64加密后,就变成了:
JhbgcioiJIUIINIIIINIIIINIIININICI6IKPXVCJ9
Payload
第二部分是Payload,可以放置自定义信息、过期时间、发行人等。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022}Base64加密后,它变成了:eyJzdWiiOixMjm0nty3odkwiwibmftZSI6ikpvaG4gRG9liwiaWF0ijoxnte2Mjm5MDIyfQ
Signature
第三部分是Signature,计算此签名需要四部分信息:
- Header中的算法信息
- Header
- Payload
- 自定义的秘密钥匙
收到JWT后,使用相同的信息再次计算签名。与JWT中的签名相比,如果不同,则表明JWT中的内容被篡改。
JWT解码后
编码以上三个部分,然后组合在一起,得到JWT。
需要注意的是,JWT的内容不是加密的,而是简单的Base64编码。也就是说,一旦JWT泄露,里面的信息很容易获取,所以JWT不应该保存任何敏感信息。
JWT是如何工作的
- 应用程序或客户端要求授权服务器。这里的授权服务器可以是一个单独的应用程序,也可以与API集成在同一个应用程序中。
- 授权服务器将JWT返回到应用程序。
- 应用程序将JWT放入请求中(通常放在HTTPAuthorization头中)
- 接到请求后,服务端验证JWT并执行相应的逻辑。
JWT在JAVA中使用
引入依赖
这里用的是JJWT(JavaJWT)的库。
JWT Service
生成JWT的过期时间为10秒,因此生成的JWT只能在10秒内验证。
- 自定义的秘密钥匙需要提供。
解码JWT
JWT的签名将在解码时进行检查,因此需要提供密钥。
验证JWT
JJWT没有提供判断JWT是否合法的方法,但在解码非法JWT时会抛出异常,因此可以通过捕获异常来判断是否合法。
注册/登录
为尚未获得JWT的用户提供这样的注册或登录入口,以获得JWT。
获得响应中的JWT后,将JWT包含在后续请求中,放在请求的Authorization头中。
验证JWT
- 将验证操作放入Filter中,除登录入口外,其他业务代码将感觉不到JWT的存在。
- 将登录入口放入WHITE_LIST,跳过这些入口的验证。
- 需要更新JWT。如果JWT是合法的,则应使用相同的Payload生成新的JWT,以便新的JWT将有新的过期时间,以刷新JWT,以防止过期。
- 如果使用Filter,刷新操作应在调用dofilter()之前,因为调用后无法修改response。
API
此时,API受到JWT的保护。API可以主动获取JWT并解码,而无需感知JWT的存在,以获取JWT中的信息。如上所示。