php中基于令牌的身份验证

Joh*_*lin 11 php authentication rest

我的网络服务器上有一个REST服务,用php编写.我想知道,什么是最好的身份验证(除了基本的http访问身份验证).我听说过基于令牌的身份证,并且想问一下是否有人可以解释主要步骤.

  • 在GET上:令牌发送是否可见?(那不安全吗?)
  • 如何使令牌仅在特定时间有效?
  • ...

客户端:Android /浏览器; 服务器:Apache,PHP5

dec*_*eze 12

它可以以任何一种方式完成,并且GET请求中的值实际上不比POST请求中的值更明显.如果有人可以"看到"(即拦截)请求,他可以看到你发送的所有内容.最后,HTTP请求只是一堆HTTP头,可能后跟一个正文.URL在第一GET /foo/bar HTTP/1.1行发送,其他值只在不同的后续行发送.

因此,您可以在何处发送您的身份验证令牌.您可以要求它是附加到每个请求的查询参数:

GET /foo/bar?user=123456&token=abcde...
Run Code Online (Sandbox Code Playgroud)

要真正按照预期使用HTTP协议,您应该使用AuthorizationHTTP标头:

Authorization: MyScheme 123456:abcde...
Run Code Online (Sandbox Code Playgroud)

此标题的内容完全取决于您.它通常指定一个授权方法Basic,然后是您想要进行身份验证的任何方法.这可以简单地是用户名和密码,它们的哈希值,客户端在某些时候或其他任何地方获得的不透明令牌.

我建议使用令牌系统或请求签名系统,后者非常受欢迎.在请求签名系统中,客户端必须从您那里获取令牌.然后,它发送此令牌的散列和请求的某些特征以验证请求,例如sha1(Token + Timestamp + Request URL + Request Body).您的服务器可以验证这一点,而客户端不必在每个请求上以纯文本形式发送令牌.

如何使令牌仅在特定时间有效?

您使用到期时间戳保存令牌服务器端并检查它.

  • 是的,最适合你的模特.也许用户需要在网站上注册并从那里复制和粘贴令牌.也许你也通过API来做到这一点,在这种情况下,JSON响应很好.2."Authorization"标头需要包含用户标识和标记哈希.该请求还必须包含时间戳,例如在"Date"标题中,这是非常标准的.哈希将基于该文字"Date"标题.您的服务器只是为用户查找令牌,确保Date在当前时间的±几分钟内并重新创建相同的哈希值. (3认同)
  • 所以基本的想法是:我不是直接发送令牌,而是向您发送哈希和信息 A、B、C。服务器从 UID 获取令牌,使用信息 A、B、C 对其进行哈希处理。并检查哈希值是否相同?!-(+时间验证人员)-这很聪明:D非常感谢 (2认同)
  • @Spring 更灵活。每个客户端都可以获得一个唯一的令牌,如果需要,这些令牌可以单独撤销。它还完全不需要客户端存储敏感信息,只需要一个随时可能失效的无意义令牌。 (2认同)
  • @Spring`Token'是共享密钥.除非有人知道共享密钥,否则任何人都不能重新创建哈希值*.有人可能能够*重用*相同的令牌来重复相同的请求,这是真的.如果这似乎是可疑活动,服务器可以过滤这些相同的请求.散列中使用的日期需要作为HTTP`Date`标头(或类似)发送.SSL确实可以实现大部分冗余安全性,但更高的安全性并不是很糟糕,特别是如果它只是一个简单但有效的散列算法. (2认同)