为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 5.6-自耗API的Passport JWT httponly cookie SPA

Laravel 5.6-自耗API的Passport JWT httponly cookie SPA

拉风的咖菲猫 2019-09-24 15:08:53
注意:我对这个问题有4个赏金,但是以下未提出答案的答案都不是这个问题所需的答案。所需的一切都在下面的Update 3中,只是在寻找Laravel代码来实现。更新3:此流程图正是我要完成的流程,下面的所有内容都是原始问题,其中包含一些较旧的更新。该流程图总结了所需的一切。下面流程图中的绿色部分是我知道该怎么做的部分。我正在寻找红色部分及其旁注,以寻求使用Laravel代码完成的帮助。在此处输入图片说明我已经做了很多研究,但是在将Laravel与JWT httponly cookie结合使用以用于自用API时,信息总是会很简短,而且并不完整(大多数在线教程仅显示JWT存储在本地存储中不是很安全) )。看起来,当包含向服务器发送的每个请求以验证用户身份时,应使用包含Passport JWT的httponly cookie来识别Javascript端的用户。要了解如何使此设置有效的完整图片,还需要一些其他事项,而在涉及该内容的单个教程中没有涉及到:从JS端登录后,Laravel Passport(不是tymon auth)将生成加密的JWT,并将其作为httponly cookie发送为响应。使用什么中间件?如果刷新令牌增加了安全性,该如何实施?调用auth端点的JavaScript(例如,axios)api伪代码,httponly cookie如何传递到后端以及后端如何验证令牌有效。如果一个帐户是从多个设备登录的,那么一个设备被盗了,如何撤消所有已认证用户设备的访问权限(假设用户从他们可以控制的登录设备上更改密码)?登录/注册,注销,更改密码,忘记密码控制器方法通常看起来像什么来处理令牌的创建/验证/吊销?CSRF令牌集成。我希望这个问题的答案可以为将来的读者和那些目前正在努力寻找一个涵盖上述要点的自学API的读者提供一个易于遵循的指南。更新1:请注意,我CreateFreshApiToken之前曾尝试过,但是在撤销用户令牌时(对于上述第3点和第4点),该方法不起作用。这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken中间件:该中间件创建的JWT令牌不会存储在任何地方。它们不能被撤销或“不存在”。它们只是提供了一种通过laravel_token cookie对您的api调用进行身份验证的方法。它与访问令牌无关。另外:通常,您不会在发行同一个应用的客户端上使用客户端发行的令牌。您可以在第一方或第三方应用中使用它们。使用中间件或客户端发行的令牌,但不能同时使用两者。因此,似乎可以满足第3点和第4点的要求,以撤销令牌,如果使用CreateFreshApiToken中间件,则不可能这样做。在客户端,Authorization: Bearer <token>处理安全的httpOnly cookie 似乎不是走的路。我认为请求/响应应该包括安全的httpOnly cookie作为请求/响应标头,例如基于laravel docs:使用这种身份验证方法时,默认的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组合的简单,直接,全面的答案,该组合使用httpOnly安全cookie覆盖上述原始5点的所有部分,创建/撤消/刷新令牌,创建登录cookie,注销cookie撤销,控制器方法,CSRF等。
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

我还在我的项目中实施了Laravel护照,我想我已经涵盖了您在问题中提到的大多数要点。

  1. 我已使用密码授予来生成访问令牌和刷新令牌。您可以按照以下步骤设置护照并实施护照授予。在登录方法中,您必须验证用户凭据并生成令牌,然后将cookie(将cookie附加到响应)附加到响应。如果您需要,我可以举一些例子。

  2. 我为CORS添加了两个中间件(处理传入的请求标头),并检查传入的访问令牌是否有效,如果无效,则从存储的刷新令牌(刷新令牌)中生成访问令牌。我可以举个例子。

  3. 登录后,来自客户端的所有请求都应包含Authorization标头(Authorization: Bearer <token>)。

让我知道您是否清楚以上几点。


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 907 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信