当前位置: 首页 > 图灵资讯 > 技术篇> 使用JWT来实现对API的授权访问

使用JWT来实现对API的授权访问

来源:图灵教育
时间:2023-05-30 09:28:18

JWT是什么?

JWT(JSONWebToken)它是一个开放的标准(RFC7519),它定义了一种紧凑而独立的方式,可以安全地传输JSON作为各种系统之间的对象,并确保传输的信息不会被篡改。

JWT通常有两种应用场景:

  • 授权。这是JWT最常见的使用场景。一旦用户登录,每个后续请求将包含一个JWT,作为用户访问资源的令牌。
  • 信息交换。JWT可以安全地将信息传输到每个系统之间,JWT的特性允许接收者验证接收到的内容是否被篡改。

本文讨论了如何利用JWT实现API授权访问的第一点。这样,只有授权用户才能调用API。

JWT的结构

使用JWT来实现对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来实现对API的授权访问_jwt_02

编码以上三个部分,然后组合在一起,得到JWT。

需要注意的是,JWT的内容不是加密的,而是简单的Base64编码。也就是说,一旦JWT泄露,里面的信息很容易获取,所以JWT不应该保存任何敏感信息。

JWT是如何工作的

使用JWT来实现对API的授权访问_http_03

  • 应用程序或客户端要求授权服务器。这里的授权服务器可以是一个单独的应用程序,也可以与API集成在同一个应用程序中。
  • 授权服务器将JWT返回到应用程序。
  • 应用程序将JWT放入请求中(通常放在HTTPAuthorization头中)
  • 接到请求后,服务端验证JWT并执行相应的逻辑。

JWT在JAVA中使用

引入依赖

使用JWT来实现对API的授权访问_python_04

这里用的是JJWT(JavaJWT)的库。

JWT Service

使用JWT来实现对API的授权访问_http_05

生成JWT的过期时间为10秒,因此生成的JWT只能在10秒内验证。

  • 自定义的秘密钥匙需要提供。

解码JWT

使用JWT来实现对API的授权访问_jwt_06

JWT的签名将在解码时进行检查,因此需要提供密钥。

验证JWT

使用JWT来实现对API的授权访问_python_07

JJWT没有提供判断JWT是否合法的方法,但在解码非法JWT时会抛出异常,因此可以通过捕获异常来判断是否合法。

注册/登录

使用JWT来实现对API的授权访问_http_08

为尚未获得JWT的用户提供这样的注册或登录入口,以获得JWT。

获得响应中的JWT后,将JWT包含在后续请求中,放在请求的Authorization头中。

验证JWT

  • 将验证操作放入Filter中,除登录入口外,其他业务代码将感觉不到JWT的存在。
  • 将登录入口放入WHITE_LIST,跳过这些入口的验证。
  • 需要更新JWT。如果JWT是合法的,则应使用相同的Payload生成新的JWT,以便新的JWT将有新的过期时间,以刷新JWT,以防止过期。
  • 如果使用Filter,刷新操作应在调用dofilter()之前,因为调用后无法修改response。

API

使用JWT来实现对API的授权访问_spring_10

此时,API受到JWT的保护。API可以主动获取JWT并解码,而无需感知JWT的存在,以获取JWT中的信息。如上所示。