我是使用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,状态字段设置为默认值,然后客户端可以更改它。
谢谢。
答案 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());