Php 简单的令牌式身份验证

Php 简单的令牌式身份验证,php,authentication,token,Php,Authentication,Token,以下认证系统是否合理: 客户端使用用户名和密码调用登录端点到主服务器。主服务器将此信息发送给另一个身份验证服务器(该服务器将不会收到进一步的通知),如果此信息有效,则该服务器将返回yes/no以及主服务器知道的用户ID。如果是,则生成一个随机令牌(使用一些抛出随机字符串的加密库),并将其散列(使用PHP的password_hash())和12小时后的到期日存储在用户记录中。将令牌返回到客户端 客户端现在将“Authorization:Token-Token+HERE+ABCD1234”添加到对其

以下认证系统是否合理:

  • 客户端使用用户名和密码调用登录端点到主服务器。主服务器将此信息发送给另一个身份验证服务器(该服务器将不会收到进一步的通知),如果此信息有效,则该服务器将返回yes/no以及主服务器知道的用户ID。如果是,则生成一个随机令牌(使用一些抛出随机字符串的加密库),并将其散列(使用PHP的password_hash())和12小时后的到期日存储在用户记录中。将令牌返回到客户端

  • 客户端现在将“Authorization:Token-Token+HERE+ABCD1234”添加到对其他端点的请求中。服务器确保auth头中的令牌散列与数据库中的令牌散列相匹配(通过PHP的password_verify()使用salt),并且未达到到期时间。如果不匹配,或者超过了有效期,则发回401

  • 看起来至少和基本HTTP身份验证一样安全,后者的头中只有base-64编码的user:password?我之所以考虑此方案而不是基本方案,是因为主服务器不会存储身份验证服务器用于登录的用户名/密码


    我忘了什么?这是非常不安全的吗?

    如果你看到谷歌的oAuth进程,你就会知道授权是如何为他们工作的

    它们有不同的服务器用于授权和API调用。用户向授权服务器发送身份验证详细信息并接收代码。谷歌正在进行获取用户同意访问详细信息的过程,但您可以跳过此过程获取同意,只需返回成功的详细信息的代码

    此代码可进一步用于从API服务器获取访问令牌。因此,您对API服务器的第一个请求是获取访问令牌。谷歌也有刷新你的访问令牌的工具

    所有对API服务器的后续请求都必须包含访问令牌。因此,您似乎错过了使其更安全的代码交换过程


    更多信息:

    您的方案与标准服务器端会话没有太大区别,在标准服务器端会话中,会话ID通常只是一个随机令牌,存储在客户端的cookie中,有两个改进:

    • 您将使用授权头来传递令牌,而不是cookie。这起到CSRF保护的作用
    • 您可以在服务器端散列一个令牌。这有助于防止会话劫持,以防有人访问服务器端的令牌存储

    @Luke,它将添加两步身份验证。现在查看会话ID。您的回答似乎表明这是一个合理的解决方案,那么?如果实施正确,我看不出有任何问题。然而,请注意,“加密安全随机数生成器”并不是真正的“吐出随机字符串的加密库”。哈哈。文档似乎表明它是加密安全的,但我会确保。干杯