简单 token-like 身份验证
Simple token-like authentication
下面的认证系统是否合理:
客户端用用户名和密码调用登录端点到主服务器。主服务器将此发送到另一个身份验证服务器(将不再提及),returns 一个 yes/no 如果这是有效的并且是主服务器知道的用户 ID。如果是,生成一个随机令牌(使用一些吐出随机字符串的加密库),并存储它的散列(使用 PHP 的 password_hash())和从现在起 12 小时后的有效期用户记录。 Return 给客户端的令牌。
客户端现在将 "Authorization: Token TOKEN+HERE+ABCD1234" 添加到他们对其他端点的请求中。服务器确保 auth header 中令牌的哈希值与数据库中的哈希值匹配(通过 PHP 的 password_verify() 使用盐),并且没有过期被击中。如果不匹配,或超过有效期,则发回 401。
似乎至少与基本 HTTP 身份验证一样安全,它只是在 header 中使用 base-64 编码 user:password?我考虑这个方案而不是基本方案的原因是主服务器不会存储身份验证服务器用来登录的 username/password。
我忘记了什么?这是非常不安全吗?
如果您看到 Google 的 oAuth 流程,您就会了解授权是如何为他们工作的。
他们有不同的服务器用于授权和 API 调用。用户将身份验证详细信息发送到授权服务器并接收代码。 Google 正在征得用户同意访问详细信息,但您可以跳过此过程以征得同意,只需 return 成功详情的代码。
此代码可进一步用于从 API 服务器获取访问令牌。因此,您对 API 服务器的第一个请求是获取访问令牌。 Google 也可以刷新您的访问令牌。
并且对 API 服务器的所有后续请求都必须包含访问令牌。所以你似乎错过了这个代码交换过程,以使其更安全。
更多信息:https://developers.google.com/identity/protocols/OAuth2
您的方案与标准 server-side sessions 没有什么不同,其中 SESSION-ID 通常只是一个随机令牌并存储在客户端的 cookie 中, 2 项改进:
- 您可以使用授权 header 代替 cookie 来传送令牌。这起到了 CSRF 保护的作用。
- 您将在 server-side 上散列一个令牌。这有助于防止 session 劫持,以防有人在 server-side.
上访问您的 token-store
下面的认证系统是否合理:
客户端用用户名和密码调用登录端点到主服务器。主服务器将此发送到另一个身份验证服务器(将不再提及),returns 一个 yes/no 如果这是有效的并且是主服务器知道的用户 ID。如果是,生成一个随机令牌(使用一些吐出随机字符串的加密库),并存储它的散列(使用 PHP 的 password_hash())和从现在起 12 小时后的有效期用户记录。 Return 给客户端的令牌。
客户端现在将 "Authorization: Token TOKEN+HERE+ABCD1234" 添加到他们对其他端点的请求中。服务器确保 auth header 中令牌的哈希值与数据库中的哈希值匹配(通过 PHP 的 password_verify() 使用盐),并且没有过期被击中。如果不匹配,或超过有效期,则发回 401。
似乎至少与基本 HTTP 身份验证一样安全,它只是在 header 中使用 base-64 编码 user:password?我考虑这个方案而不是基本方案的原因是主服务器不会存储身份验证服务器用来登录的 username/password。
我忘记了什么?这是非常不安全吗?
如果您看到 Google 的 oAuth 流程,您就会了解授权是如何为他们工作的。
他们有不同的服务器用于授权和 API 调用。用户将身份验证详细信息发送到授权服务器并接收代码。 Google 正在征得用户同意访问详细信息,但您可以跳过此过程以征得同意,只需 return 成功详情的代码。
此代码可进一步用于从 API 服务器获取访问令牌。因此,您对 API 服务器的第一个请求是获取访问令牌。 Google 也可以刷新您的访问令牌。
并且对 API 服务器的所有后续请求都必须包含访问令牌。所以你似乎错过了这个代码交换过程,以使其更安全。
更多信息:https://developers.google.com/identity/protocols/OAuth2
您的方案与标准 server-side sessions 没有什么不同,其中 SESSION-ID 通常只是一个随机令牌并存储在客户端的 cookie 中, 2 项改进:
- 您可以使用授权 header 代替 cookie 来传送令牌。这起到了 CSRF 保护的作用。
- 您将在 server-side 上散列一个令牌。这有助于防止 session 劫持,以防有人在 server-side. 上访问您的 token-store