laravel 5.3 护照和角度存储访问令牌
Posted
技术标签:
【中文标题】laravel 5.3 护照和角度存储访问令牌【英文标题】:laravel 5.3 passport and angular storing access tokens 【发布时间】:2017-03-22 16:56:56 【问题描述】:我正在对用户进行身份验证以使用我自己的 API(因此是受信任的来源)。我正在努力确定的是在客户端存储返回 access_token 的最佳位置在哪里?我是创建一个 cookie,还是将数据保存在本地存储中?
我也应该只存储access_token,我应该记录refresh_token吗?刷新令牌是做什么用的?
【问题讨论】:
localstorage 或 cookie 中的任何一种都可用于存储 access_token。 我也应该只存储access_token,我应该记录refresh_token吗?刷新令牌的用途是什么? Ans. :access_token 有到期期限,因此如果您希望您的用户在 access_token 到期后注销或通过刷新现有令牌继续会话,这取决于您。希望您了解刷新令牌的使用。 【参考方案1】:即使您的刷新令牌在一段时间后过期,您也只将访问令牌存储在客户端会更安全,尽管这样做会减少可能的攻击窗口。
这是一种方法(如果您想存储访问和刷新令牌):
https://***.com/a/18392908/5549377
但是还有另一种方法。 这样,客户端只会获取访问令牌,而刷新令牌对用户是完全隐藏的。但为了做到这一点,访问令牌和刷新令牌应该存储在服务器端。最好的地方是在数据库中。这就提出了一个显而易见的问题:安全性?答案是您始终可以加密存储在数据库中的数据并尽可能保护您的数据库。
-
创建一个表(user_token表),可以存储user_id、access token、refresh_token甚至session_id。
在每次登录时,检查 user_token 表中 user_id 下是否存在记录。如果不存在,则请求 oauth/token 并将访问权和刷新令牌存储在 user_token 表中。
登录成功后,你可以在你的 Angular 中编写一个 .run 函数来为用户请求访问令牌。 (请记住,在 user_token 表中,我们有一个“user_id”列。因此,您可以通过 laravel 中的
Auth::id()
函数请求过滤当前登录的用户。
一旦找到访问令牌,服务器应该只将访问令牌和访问令牌返回给客户端。
客户端收到访问令牌后,您可以通过将收到的 access_token 添加到标头中,对受'middleware' => 'auth:api'
保护的路由进行握手调用,如下所示:$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token;
。同样在这样做之后,请确保将相同的标记添加到 rootscope 变量中,如下所示:$rootScope.accesstoken = data.access_token;
如果握手调用成功,那么您可以将有效访问令牌从 rootscope 添加到 angular cookie,如下所示:$cookies.put('access_token', $rootScope.accesstoken);
如果握手调用不成功,您可以请求一个新的令牌。要请求新令牌,请使用将重定向到单独函数的新路由。此函数将获取当前用户的 user_id 下的刷新令牌,并从 oAuth 端点请求新的访问令牌(请参阅 Passport API 文档)。执行此操作后,更新“user_tokens”表中用户下的记录,并将新的访问令牌返回给 Web 客户端。在 web 客户端,将收到的令牌存储在 angular cookie 中,如下所示:$cookies.put('access_token', $rootScope.accesstoken);
并将相同的令牌添加到 http 标头中,例如:$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token
;
顺便说一句,为什么我提到我应该将令牌存储在 angular cookie 中。好吧,如果你只将它存储在rootscope
上,如果页面刷新,应用程序将不得不再次请求令牌,因为无论角度根范围中的数据在刷新后都会丢失。但在角饼干中,它不是。因此这就是为什么我建议添加到 angular cookie 中。
非常重要:
对于您发出的每个 ajax 请求,如果请求在代码 401(未经授权的访问)下失败,您应该从 angular 调用请求新令牌函数到 Laravel 的请求新令牌函数。成功后,将新令牌插入到我提到的 http 标头和 angular cookie 中。
注意:
刷新令牌的目的是验证您是否是旧访问令牌的经过身份验证的用户(我们将令牌称为 xxx)。
只要访问令牌过期,您就可以使用它。一旦完成,你需要告诉服务器你不能使用这个 access_token xxx 并且它现在已经过期了,所以给我一个新的令牌。当你发出这个请求(给你一个新的令牌)时,服务器应该知道你是前一个访问令牌的合法用户,所以服务器会要求你证明你是合法的。届时,您可以出示刷新令牌并证明您是合法的服务器。这是刷新令牌的使用。
那么服务器将如何通过刷新令牌验证您是否合法? 最初,当您请求访问令牌时,您会获得刷新令牌,因此在这种情况下服务器会知道。
我建议您阅读并了解有关 OAuth 2.0 的更多信息。
【讨论】:
【参考方案2】:我最近浏览了一些用于令牌存储的客户端选项,因此我将向您推荐 answer provided in: Where to save a JWT in a browser-based application。
长话短说,cookie 和 Web 存储都是存储访问令牌的合适选项,正确的选择取决于您的具体情况。
关于您应该存储的内容,它通常只是访问令牌,主要是因为refresh tokens 通常不会发给基于浏览器的应用程序,因为它们是长期存在的凭据,这意味着试图窃取它们的人的可用时间非常长增加和浏览器存储选项都有其不足。
当客户端应用程序想要访问最终用户拥有的受保护资源时,即使用户没有与应用程序交互,刷新令牌也特别重要;通常称为离线访问。基于浏览器的应用程序的大多数场景仍然暗示用户在线,因此缺少刷新令牌并不是什么大问题。
【讨论】:
以上是关于laravel 5.3 护照和角度存储访问令牌的主要内容,如果未能解决你的问题,请参考以下文章