Token 从客户端向JWT添加数据

Token 从客户端向JWT添加数据,token,jwt,api-design,Token,Jwt,Api Design,我刚开始使用JWTs。我有一个API,它为客户端生成一个JWT,供进一步请求进行身份验证。My JWT有一个返回用户id的属性: { jwt: { exp: "2017-12-12 00:00:00", data: { user_id: 491 } } } 我的问题是,客户端是否可以解码API生成的JWT,并在数据字段中添加一个新属性,如下所示: { jwt: { exp: "2017-12-12 00:00:00", data:

我刚开始使用JWTs。我有一个API,它为客户端生成一个JWT,供进一步请求进行身份验证。My JWT有一个返回用户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 auth系统生成JWT,并将状态字段设置为默认值,那么客户机可以更改它


谢谢。

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

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

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


您可以阅读更多相关信息。

换句话说,您想篡改您的JWT令牌,如果不使令牌无效,您将无法执行此操作


签名在报头和有效负载上计算。令牌颁发者(服务器)检查签名,以验证内容在过程中没有更改。

在最新版本的JWT Auth中

  $token = JWTAuth::claims(['account_id' => $account->id])->fromUser($user);
 $token = JWTAuth::fromUser($user, ['account_id' => $account->id]);
要从令牌获取数据,请执行以下操作:

$payload = JWTAuth::getPayload();
$accountId = $payload->get('account_id');
$payload = JWTAuth::getPayload(JWTAuth::getToken());
在JWT auth的预览版本中

  $token = JWTAuth::claims(['account_id' => $account->id])->fromUser($user);
 $token = JWTAuth::fromUser($user, ['account_id' => $account->id]);
要从令牌获取数据,请执行以下操作:

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

因此,使用可能更改其值的字段的唯一方法是直接通过数据库从我的API执行,即如果用户提出请求,我的API应该查询数据库以检查该用户的状态,或者您可以建议另一种解决方法?最好是令牌的内容从未更改。这意味着后端在发出初始令牌时,应该从DB获得令牌中所需的一切。如果您想在创建初始令牌后更改令牌的有效负载,那么后端必须创建一个新令牌并将其发送给客户端。嗯。。。我想这不是最好的方法,我对API auth这个话题还很陌生,我想我需要做更多的研究来知道我应该做什么。谢谢