【发布时间】:2019-05-09 17:18:25
【问题描述】:
注意:我在这个问题上获得了 4 个赏金,但以下投票支持的答案都不是这个问题所需的答案。所需的一切都在下面的 Update 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 如何传递给后端,后端如何验证令牌是否有效。
- 如果单个帐户从多个设备登录,则设备被盗,如何撤消所有经过身份验证的用户设备的访问权限(假设用户从他们控制的已登录设备上更改密码)?
- Login/Register、Logout、Change Password、Forgot Password 控制器方法通常会如何处理令牌的创建/验证/撤销?
- CSRF 令牌集成。
我希望这个问题的答案可以作为一个易于理解的指南,供未来的读者和那些目前正在努力寻找涵盖上述自用 API 的答案的人使用。
更新 1:
- 请注意,我之前尝试过
CreateFreshApiToken,但在撤销用户令牌时不起作用(对于上面的第 3 点和第 4 点)。这是基于 laravel 核心开发人员的 this comment,在谈到CreateFreshApiToken中间件时:
此中间件创建的 JWT 令牌不会存储在任何地方。他们 不能撤销或“不存在”。他们只是为您提供了一种方式 api 调用通过 laravel_token cookie 进行身份验证。它不是 与访问令牌有关。 另外:您通常不会在发布它们的同一应用程序上使用客户端发布的令牌。您会在第一方或第三方中使用它们 应用程序。要么使用中间件,要么使用客户端颁发的令牌,但不使用 两者同时进行。
所以它似乎能够满足第 3 点和第 4 点来撤销令牌,如果使用 CreateFreshApiToken 中间件是不可能的。
- 在客户端,
Authorization: Bearer <token>似乎不是处理安全 httpOnly cookie 的方法。我认为请求/响应应该包含安全的 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:
似乎密码授予/刷新令牌授予组合是要走的路。使用 Password Grant/Refresh Token Grant 组合寻找易于遵循的实施指南。
密码授予: 这笔赠款适用于与我们信任的客户打交道时, 就像我们自己网站的移动应用程序一样。在这种情况下,客户端发送 用户到授权服务器的登录凭据和 服务器直接发出访问令牌。
刷新令牌授予: 当服务器发出访问令牌时,它还会为 访问令牌。当我们想要刷新 访问令牌一旦过期。在这种情况下,授权服务器 在发出访问令牌时会发送一个刷新令牌,可以是 用于请求新的访问令牌。
我正在使用 Password Grant/Refresh Token Grant 组合寻找一个易于实施、直接、全面的答案,该组合使用 httpOnly 安全 cookie 涵盖上述原始 5 点的所有部分,创建/revoking/refreshing 令牌、登录 cookie 创建、注销 cookie 撤销、控制器方法、CSRF 等。
【问题讨论】:
-
我在 Laravel 中使用了 Luca Desgasperi 的 Passport 和 Oauth2。当涉及到移动应用程序和 Javascript 时,密码授予类型并不安全。只有授权码流程是可以的。但根据数据的敏感性,令牌的持续时间不得超过 2 分钟至 60 分钟或更长时间。 Facebook 令牌现在是 2 分钟 + 1 次使用。使用授权码授权类型,浏览器会询问用户名和密码并请求访问您的应用程序或您自己的网站(默认情况下允许)的权限,然后只发送一个带有过期时间的令牌,该令牌会刷新每个时间
-
@KeitelDOG 谢谢你的意见,但这个包只升级到 Laravel 5.3,他们也弃用了它,转而支持 Passport。如前所述,我正在寻找涵盖上述所有要点的整体方法/解决方案/实施指南。
-
我知道,这就是我切换到 Passport 的原因。 Passport 更好,最后一个版本甚至可以根据您的需要控制在特定客户端中撤销用户令牌 3.
-
您好,在我们的 SPA Laravel 应用程序中,我们使用默认的 Web 身份验证(会话保护)登录用户。在加载 SPA 应用程序之前,我们还生成一个 csrf_token 并将其放置在元数据中。完成这两个操作后,我们使用 CreateFreshApiToken 中间件来确定 SPA 是否需要 now 令牌。最后使用令牌从 api 进行身份验证/授权。这是你想要的吗?
-
对我来说,这种论点应该在官方文档中处理......如果护照旨在成为处理身份验证的安全方式,则应清楚地解释这种情况。经过几天的研究,我发现几乎没有人以正确的方式处理这个问题。
标签: laravel laravel-5 csrf-protection laravel-passport cookie-httponly