使用JWT的用户数据

时间:2017-03-27 02:38:15

标签: php jwt

我正在考虑将基于PHP会话的用户门户迁移到JWT无状态API,我不太确定我是否理解这一点。

访问令牌应该存储什么?用户数据库具有用于用户标识,用户名和电子邮件地址的自动增量主键。数据库中的所有关系表都由用户标识引用。我不知道在公共令牌中传递用户ID是否是一种好习惯。我想也许可以传递电子邮件地址,但这意味着我必须在每个页面加载时拉取用户记录,以便我可以通过用户ID访问其他表。

另外,如何将用户详细信息传递到下一页?以前我会在登录时将这些字段存储在$ _SESSION中,但现在不可能。这是否意味着我每次都必须手动提取用户记录?

最后,如何在注销时使令牌无效?

谢谢!

2 个答案:

答案 0 :(得分:0)

您不需要在注销时执行任何操作。只需从用户的浏览器中删除令牌 即function logout(){ localStorage.removeItem(key); }

答案 1 :(得分:0)

您没有理由担心在JWT中暴露您的用户ID。 JWT所做的就是它有一个有效载荷(比如你的用户的电子邮件,名称,用户ID等),一个标题(使用的加密类型)和一个签名(你编码的标题,有效负载和一个秘密)。你只是在做什么,每当你想验证JWT是否有效时,你只需用你在服务​​器上安全存放的私钥来检查它。

这意味着JWT有效负载可以减少数据库连接和查询的数量,因为您无需一直对数据库进行双重检查。您只需要服务器使用内部存储的私钥来验证JWT,页面加载,每个事务等等。

用户详细信息可以简单地从有效负载中获取(只有64位编码,根本不加密),因此您可以在PHP中使用$_COOKIE[](作为HTTP请求的一部分传输)或使用JS解码客户端的有效负载。

只需从用户cookie或本地存储中删除JWT即可使其无效。有许多方法可以使它失效,例如:

  • 当您发现它已经过了有效期
  • 当您检测到它被操纵时,基于您的私钥的签名验证失败