JSON Web Token (JWT): Authorization vs Authentication

2022-09-01 20:59:35

智威汤逊的术语一直困扰着我,原因有几个。JWT 是适用于授权还是仅适用于身份验证?

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

如何使用 JWT 根据用户拥有的角色来限制他们?JWT是否也提供任何类型的授权详细信息,还是仅向我们提供身份验证?

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


答案 1

可以使用令牌特定的声明实现对 JWT 授权

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

通常,授权将基于权限,其中权限用于限制对 API 终结点的访问(也可用于授予用户对前端应用上视图的访问权限)。

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

{
  "UserInfo": {
    "id": "#{USER_ID}",
    "roles": {
      "#{ROLE_NAME}": "#{ROLE_ID}"
    },
    "permissions": {
      "#{PERMISSION_NAME}": "#{PERMISSION_ID}",
    }
  },
  "exp": 1488888888
}

答案 2

JWT可用于两个目的:

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

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

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

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

jwt.io 的例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

它包含:

{
  "alg": "HS256",
  "typ": "JWT"
}
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

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