JSON Web令牌(JWT):授权与身份验证

Roh*_*adu 9 java json jwt

JWT术语一直困扰着我,原因很少.JWT是否适合授权或仅用于身份验证?

如果我错了,请纠正我,但我一直认为授权是允许某人访问资源的行为,但JWT似乎没有任何实际允许访问给定资源的用户的实现.所有JWT实现都在谈论为用户提供令牌.然后,每次调用时都会将此令牌传递给后端服务端点,在后端服务端点检查其是否有效以及是否授予了有效访问权限.因此,我们可以使用JWT对任何用户进行身份验证,但我们如何限制对特定有效用户的访问?

我们如何使用JWT根据他们的角色限制少数用户?JWT是否也提供任何类型的授权细节,或者它只是向我们提供认证?

提前感谢您的帮助并耐心地阅读我的疑问.

tma*_*wen 8

授权JWT可以使用令牌具体实现的权利要求.

由于在Json Web令牌中打包为声明的许多其他用户信息,特定权限可以预先填充在令牌中,并且可以在稍后由授权服务拦截.

通常,授权是基于权限的,其中权限用于限制对api端点的访问(还可以用于授予用户对前端应用程序上的视图的访问权).

这里是一个具有权限元素的示例JWT令牌:

{
  "UserInfo": {
    "id": "#{USER_ID}",
    "roles": {
      "#{ROLE_NAME}": "#{ROLE_ID}"
    },
    "permissions": {
      "#{PERMISSION_NAME}": "#{PERMISSION_ID}",
    }
  },
  "exp": 1488888888
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回复 。它帮助了我。 (2认同)

JEY*_*JEY 5

JWT可以用于两个目的:

  1. 身份验证(如您所说)
  2. 信息交流。

第二部分是有趣的部分。JWT包含:

  • 标头:包含算法和令牌类型
  • 有效负载:关于实体(通常是用户)和其他元数据的语句。共有三种类型的索赔:注册,公共和私人索赔。
  • 签名:签名用于验证JWT的发件人是谁,并确保消息在此过程中未被更改。

有效负载可以包含有关用户的信息,例如权限列表。这样,您可以将其用于授权。

来自jwt.io的示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Run Code Online (Sandbox Code Playgroud)

其中包含:

{
  "alg": "HS256",
  "typ": "JWT"
}
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
Run Code Online (Sandbox Code Playgroud)

您会看到有效负载包含有关管理权限的标识和信息。由于有效负载签名,您可以信任这些数据。

  • 你可以做任何你想做的事,但 https://www.iana.org/assignments/jwt/jwt.xhtml 定义了标准公共声明和 https://tools.ietf.org/html/rfc7519 定义了注册声明 (2认同)