【问题标题】:Adding data to JWT from the client-side从客户端向 JWT 添加数据
【发布时间】:2018-04-21 01:03:41
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: token jwt api-design


    【解决方案1】:

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

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

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

    您可以阅读更多关于 here 的信息。

    【讨论】:

    • 因此,使用可以更改其值的字段的唯一方法是直接通过我的 API 中的数据库执行此操作,即如果用户提出请求,我的 API 应查询数据库以检查该用户的状态,或者您可以建议其他解决方法?
    • 如果令牌的内容永远不会改变,那就最好了。这意味着后端在发布初始令牌时应该从数据库中获取令牌中所需的一切。如果您希望在创建初始令牌后更改令牌的有效负载,则后端必须创建一个新令牌并将其发布给客户端。
    • 嗯...我想这不是最好的方法,我对 API 身份验证这个主题还很陌生,我想我必须进行更多研究才能知道我应该做什么。谢谢。
    【解决方案2】:

    换句话说,您想篡改您的 JWT 令牌,如果不使令牌失效,您就无法做到。

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

    【讨论】:

      【解决方案3】:

      在最新版本的 JWT 身份验证中

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

      token 中的数据:

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

      在 JWT auth 的预览版中

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

      token 中的数据:

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

      【讨论】:

        猜你喜欢
        • 2018-06-28
        • 2015-01-08
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2021-04-03
        • 2016-01-09
        相关资源
        最近更新 更多