RESTful身份验证 - 有关流程的问题

时间:2015-03-25 16:28:54

标签: php rest authentication encryption restful-authentication

我觉得网络安全是一个非常有趣的主题,我正在努力学习如何制作API和RESTful Web服务。我正在阅读this answer,并对 Way-2 中描述的流程提出了一些问题。我理解Way-2的要点,但我在第4步开始提问。

首先让我们描述一下令牌变量。

$token = '123';
$tokenHashed = 'abc';
$tokenEncrypted = 'xyz';

在步骤4,我们验证了用户,现在是时候创建一个令牌并将其与数据库中的该用户关联,并将其发送到客户端。以下是关于该流程的问题:

  1. 我们存储在数据库中的令牌是“hashed(abc)”,“encrypted(xyz)”还是“both(123)”?
  2. 当我们发送给客户时,我们发送了“哈希(abc)”,“加密(xyz)”还是“不(123)”?
  3. 此令牌存储在客户端计算机上的哪个位置?我正在使用PHP,所以它会在$ ['SESSION']或$ ['COOKIE']变量中?有关系吗?哪一个和为什么?
  4. 我认为这涵盖了第4步中的所有内容,所以让我们继续第5步。关于第5步我关注的一件事就是它说:“然后调用者发送这个身份验证令牌......”我读过你从不传输令牌,所以这里有更多问题(假设客户端的令牌存储在状态之上的任何时尚答案中):

    1. 客户端是否发送令牌“hashed(abc)”,“encrypted(xyz)”或“both(123)”?

      如果他们只是将我们发送给他们的方式发回去,那么重点是什么?如果有人以我们发送的任何形式劫持令牌,它是否总是与我们存储它的方式相匹配?例如,我向USER X发送一个随机散列字符串(abc)。用户Y拦截它并发送给我(abc)。我的数据库说“abc”,安全性失败。

    2. 我可能会随着答案的出现继续开发/添加问题。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

JWT是一种解决方案,REST API是无状态的。这意味着来自客户端的每个请求都应包含处理请求所需的所有信息,因此php会话不合适。您可以阅读此内容Goodbye PHP Sessions, Hello JSON Web Tokens

您不需要在数据库中保存JWT令牌,只需在服务器端生成带有密钥的令牌并发送给客户端,客户端应在每次请求时发送令牌。

浏览器可以将令牌保存在html5 localStorage或cookie中。

服务器使用secrete密钥解析加密的令牌,然后从令牌中获取信息。

也许您可以在JWT令牌中保留一些消息,如:

  1. 到期时间。
  2. client ip。
  3. 类型。
  4. ...自定义消息。