注意:我在这个问题上有 4 个赏金,但下面的投票答案都不是这个问题所需的答案。所需的一切都在下面的更新 3 中,只是寻找 Laravel 代码来实现。
更新 3:这个流程图正是我想要完成的流程,下面的所有内容都是一些旧更新的原始问题。此流程图总结了所需的一切。
下面流程图中的绿色部分是我知道该怎么做的部分。红色部分及其旁注是我正在寻找使用 Laravel 代码完成的帮助。
我做了很多研究,但是在将 Laravel 与 JWT httponly cookie 一起用于自用 API 时,信息总是很短且不完整(大多数在线教程仅显示 JWT 存储在本地存储中,这不是很安全)。看起来应该使用包含 Passport 的 JWT 的 httponly cookie 来识别 Javascript 端的用户,当每个请求发送到服务器以验证用户是他们所说的那个人时。
还需要一些额外的东西来全面了解如何使这个设置工作,我在一个涵盖这个的教程中没有遇到过:
- Laravel Passport(不是 tymon auth)生成加密的 JWT 并在从 JS 端登录后将其作为 httponly cookie 作为响应发送。使用什么中间件?如果刷新令牌增加了更多安全性,如何实现?
- 调用 auth 端点的 JavaScript(例如 axios)api 伪代码,如何将 httponly cookie 传递给后端,以及后端如何验证令牌是否有效。
- 如果从多个设备登录单个帐户,则设备被盗,如何撤消所有经过身份验证的用户设备的访问权限(假设用户从他们控制的已登录设备更改密码)?
- 登录/注册、注销、更改密码、忘记密码控制器方法通常会如何处理令牌的创建/验证/撤销?
- CSRF 令牌集成。
我希望这个问题的答案可以作为一个易于理解的指南,供未来的读者和那些目前正在努力寻找涵盖上述自用 API 的答案的人使用。
更新 1:
- 请注意我之前尝试
CreateFreshApiToken
过,但是在撤销用户的令牌时不起作用(对于上面的第 3 点和第 4 点)。这是基于核心 laravel 开发人员在谈论中间件时的评论:CreateFreshApiToken
此中间件创建的 JWT 令牌不会存储在任何地方。它们不能被撤销或“不存在”。它们只是为您的 api 调用提供了一种通过 laravel_token cookie 进行身份验证的方法。它与访问令牌无关。另外:您通常不会在发布它们的同一应用程序上使用客户端发布的令牌。您可以在第一方或第三方应用程序中使用它们。要么使用中间件,要么使用客户端发出的令牌,但不能同时使用两者。
所以它似乎能够满足第 3 点和第 4 点来撤销令牌,如果使用CreateFreshApiToken
中间件则不可能这样做。
- 在客户端,处理安全的 httpOnly cookie 似乎
Authorization: Bearer <token>
不是要走的路。我认为请求/响应应该包含安全的 httpOnly cookie 作为请求/响应标头,就像这样基于 laravel 文档:
当使用这种身份验证方法时,默认的 Laravel JavaScript 脚手架会指示 Axios 始终发送 X-CSRF-TOKEN 和 X-Requested-With 标头。
headerswindow.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': (csrf_token goes here)
};
这也是我正在寻找涵盖上述所有要点的解决方案的原因。抱歉,我使用的是 Laravel 5.6 而不是 5.5。
更新 2:
看来密码授予/刷新令牌授予组合是要走的路。寻找使用密码授予/刷新令牌授予组合的易于遵循的实施指南。
密码授权: 此授权适用于与我们信任的客户打交道,例如我们自己网站的移动应用程序。在这种情况下,客户端将用户的登录凭据发送到授权服务器,服务器直接颁发访问令牌。
Refresh Token Grant: 当服务器发出访问令牌时,它也会设置访问令牌的到期时间。当我们想要在访问令牌过期后刷新访问令牌时,使用刷新令牌授权。在这种情况下,授权服务器会在发布访问令牌时发送一个刷新令牌,该令牌可用于请求新的访问令牌。
我正在寻找一个易于实施、直接、全面的答案,使用密码授予/刷新令牌授予组合,该组合涵盖上述原始 5 点的所有部分,使用 httpOnly 安全 cookie、创建/撤销/刷新令牌、登录 cookie 创建,注销 cookie 撤销、控制器方法、CSRF 等。