从客户端

时间:2017-11-08 11:05:17

标签: token jwt api-design

我是使用JWT的新手。我有一个API,为客户端生成JWT以进行进一步请求的身份验证。我的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身份验证系统生成JWT,状态字段设置为默认值,然后客户端可以更改它。

谢谢。

3 个答案:

答案 0 :(得分:5)

客户端可以这样做,但它会使令牌无效。当您更改有效负载的内容时,例如添加另一个字段或更改其内容,令牌的签名不再匹配。当API收到带有无效签名的令牌时,它应该拒绝该令牌。想象一下,如果您有一个名为@if (isset($data)) <ul> @foreach ($data as $row) <li>{{ $row->name }}</li> @endforeach </ul> @endif 的字段,并且客户端可以将其从isAdmin更改为false。它会使你的身份验证毫无意义;客户端不会决定它是否是管理员,后端会这样做。

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

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

您可以详细了解here

答案 1 :(得分:1)

换句话说,您希望篡改您的JWT令牌,如果没有令牌无效,则无法执行此操作。

签名是通过标头和有效负载计算的。令牌发行者(服务器)检查签名以验证内容在此过程中是否未被更改。

答案 2 :(得分:0)

在最新版本的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());