从客户端向 JWT 添加数据

Adding data to JWT from the client-side

我是 JWT 新手。我有一个 API 为客户端生成一个 JWT,以便对进一步的请求进行身份验证。我的 JWT 有一个 属性,returns 用户 ID:

{
  jwt: {
    exp: "2017-12-12 00:00:00",
    data: {
      user_id: 491
    }
  }
}

我的问题是客户端是否可以解码由 API 生成的 JWT 并将新的 属性 添加到数据字段中,如下所示:

{
  jwt: {
    exp: "2017-12-12 00:00:00",
    data: {
      user_id: 491,
      status: 1
    }
  }
}

或者,如果我可以从 API 身份验证系统生成 JWT,并将状态字段设置为默认值,然后客户端可以更改它。

谢谢。

客户端可以这样做,但会使令牌无效。当您更改有效负载的内容时,例如添加另一个字段或更改其内容,令牌的签名不再匹配。当 API 收到带有无效签名的令牌时,它应该拒绝该令牌。想象一下,如果您有一个名为 isAdmin 的字段,并且客户端可以将其从 false 更改为 true。这会使您的身份验证毫无意义;客户端不决定它是否是管理员,后端决定。

当令牌的有效负载发生变化时,必须重新制作签名。为了签署令牌,客户端必须知道密钥(对于 H256)。但是客户端不应该知道密钥。

所以答案是否定的,客户端不能更改令牌。

您可以阅读更多相关内容 here

换句话说,您想篡改您的 JWT 令牌,并且您不能在不使令牌无效的情况下做到这一点。

签名是在 header 和有效负载上计算的。令牌发行者(服务器)检查签名以验证内容在途中没有被更改。

在最新版本的 JWT Auth

  $token = JWTAuth::claims(['account_id' => $account->id])->fromUser($user);

从令牌获取数据:

$payload = JWTAuth::getPayload();
$accountId = $payload->get('account_id');

JWT auth预览版

 $token = JWTAuth::fromUser($user, ['account_id' => $account->id]);

从令牌获取数据:

$payload = JWTAuth::getPayload(JWTAuth::getToken());