浏览器和非浏览器客户端的会话身份验证

Session authentication for both browser and non-browser clients

我想知道以下基于令牌的身份验证设计是否合理。

  1. 客户端发布登录凭据
  2. 验证后,服务器生成(session_key, expires_at) <- (a 256-bit pseudo-random string, some date in the future)并将其保存在选择的存储系统中。
  3. 服务器在响应的 HTTP-Only cookie 中设置 session_key。
  4. 服务器设置响应负载 {session_key: ..., expires_at: ...}。原因是非浏览器客户端没有cookie,他们会读取这个payload,存储在本地以备将来使用。

具体来说,我认为系统需要在有效负载中发送令牌以及非浏览器客户端的 cookie。这是一种常见的做法吗?还是我遗漏了一些重要的东西,还有更好的选择?

正如我在 中指出的那样,这很好。与仅在 cookie 中一样,它不会公开会话密钥。只有当攻击者可以使用有效的 user/password 组合调用您的身份验证端点时,才会发生这种情况。

确保您的身份验证端点不接受有效会话并回显他们的密钥,因为这可能会使您暴露于 CSRF 和会话窃取!

有关其他身份验证方法,请查看我整理的 Web Authentication Guide