laravel 5.3护照和角存储访问令牌

时间:2016-11-08 22:29:17

标签: php angularjs laravel-5 oauth-2.0 laravel-passport

我正在验证用户使用我自己的API(因此是受信任的来源)。我正在努力确定的是在客户端存储返回access_token的最佳位置在哪里?我是创建cookie还是将数据保存在localstorage中?

我也应该只存储access_token,我应该记录refresh_token吗?用于什么的刷新令牌?

2 个答案:

答案 0 :(得分:2)

如果您只在客户端存储访问令牌更安全,即使您的刷新令牌在一段时间后过期,尽管这样做会减少可能的攻击窗口。

这是一种方法(如果你想存储访问和刷新令牌):

https://stackoverflow.com/a/18392908/5549377

然而,还有另一种方法。 通过这种方式,客户端将只获取访问令牌,并且刷新令牌完全对用户隐藏。但为了做到这一点,访问令牌以及刷新令牌应该存储在服务器端。最好的地方是在数据库中。这提出了一个显而易见的问题:安全性?那么答案就是你总是可以加密存储在数据库中的数据并尽可能保护你的数据库。

  1. 创建一个表(user_token表),可以存储user_id,访问令牌,refresh_token甚至session_id。
  2. 在每次登录时检查user_token表中user_id下是否存在记录。如果它不存在,请请求 oauth / token 并将访问权限和刷新令牌存储在user_token表中。
  3. 登录成功后,您可以在角度中编写.run函数,以请求用户访问令牌。 (请记住在user_token表中我们有一个“user_id”列。因此,您可以请求从laravel中的Auth::id()函数过滤当前登录的用户。
  4. 找到访问令牌后,服务器应仅将访问令牌和访问令牌返回给客户端。
  5. 客户端收到访问令牌后,您可以通过将收到的access_token添加到标头中来'middleware' => 'auth:api'对受$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token;保护的路由进行握手调用:$rootScope.accesstoken = data.access_token;。在执行此操作之后,请确保将相同的标记添加到rootscope变量中,如下所示:$cookies.put('access_token', $rootScope.accesstoken);
  6. 如果握手调用成功,那么您可以将有效的访问令牌从rootscope添加到角度cookie,如下所示:$cookies.put('access_token', $rootScope.accesstoken);
  7. 如果握手呼叫不成功,您可以申请新的令牌。要请求新令牌,请使用将重定向到单独功能的新路由。此函数将获取当前用户的user_id下的刷新令牌,并从oAuth端点请求新的访问令牌(请参阅Passport API文档)。执行此操作后,在“user_tokens”表中更新用户下的记录,并将新的访问令牌返回给Web客户端。在webclient方面,将收到的令牌存储在角度cookie中,如下所示:$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token并将相同的令牌添加到http标题中:rootscope;
  8. 顺便说一下,为什么我提到我应该将令牌存储在角度cookie中。好吧,如果你只将它存储在{{1}}上,如果页面刷新,应用程序将不得不再次请求令牌,因为角度rootcope中的任何数据在刷新后都会丢失。但在角饼干中,它不是。因此,这就是我建议添加角饼干的原因。

    非常重要:

    对于您发出的每个ajax请求,如果请求在代码401(未授权访问)下失败,您应该从angular调用请求新令牌函数到Laravel的请求新令牌函数。一旦成功,就像我提到的那样将新标记插入http标头和角度cookie。

    注意:

    刷新令牌的目的是验证您是旧访问令牌的经过身份验证的用户(让我们调用令牌 xxx )。

    只要过期令牌过期,您就可以使用它。完成后,您需要告诉服务器您无法使用此access_token xxx 并且它现在已过期,因此请给我一个新令牌。当您提出此请求(为您提供新令牌)时,服务器应该知道您是先前访问令牌的合法用户,因此服务器会要求您证明您是合法的。那时,您可以呈现刷新令牌并证明服务器您是合法的。这是刷新令牌的使用。

    那么服务器将如何通过刷新令牌验证您是否合法? 最初,当您请求访问令牌时,您将获得刷新令牌,因此服务器将知道。

    我建议您阅读并了解有关OAuth 2.0的更多信息。

答案 1 :(得分:0)

我最近通过了一些客户端选项进行令牌存储,因此我将answer provided in: Where to save a JWT in a browser-based application推荐给您。

简而言之,Cookie和网络存储都是存储访问令牌的合适选项,正确的选择取决于您的具体情况。

关于您应该存储的内容,它通常只是访问令牌,因为refresh tokens通常不会发布到基于浏览器的应用程序,因为它们是长期存在的凭据,意味着可供某人使用的时间试图窃取他们的人数大大增加,浏览器存储选项都有其不足之处。

当客户端应用程序想要访问最终用户拥有的受保护资源时,即使用户没有与应用程序交互,刷新令牌也是特别有意义的;通常称为脱机访问。基于浏览器的应用程序的大多数场景仍然暗示用户在线,因此缺少刷新令牌并不是一件大事。