我正在验证用户使用我自己的API(因此是受信任的来源)。我正在努力确定的是在客户端存储返回access_token的最佳位置在哪里?我是创建cookie还是将数据保存在localstorage中?
我也应该只存储access_token,我应该记录refresh_token吗?用于什么的刷新令牌?
答案 0 :(得分:2)
如果您只在客户端存储访问令牌更安全,即使您的刷新令牌在一段时间后过期,尽管这样做会减少可能的攻击窗口。
这是一种方法(如果你想存储访问和刷新令牌):
https://stackoverflow.com/a/18392908/5549377
然而,还有另一种方法。 通过这种方式,客户端将只获取访问令牌,并且刷新令牌完全对用户隐藏。但为了做到这一点,访问令牌以及刷新令牌应该存储在服务器端。最好的地方是在数据库中。这提出了一个显而易见的问题:安全性?那么答案就是你总是可以加密存储在数据库中的数据并尽可能保护你的数据库。
Auth::id()
函数过滤当前登录的用户。'middleware' => 'auth:api'
对受$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token;
保护的路由进行握手调用:$rootScope.accesstoken = data.access_token;
。在执行此操作之后,请确保将相同的标记添加到rootscope变量中,如下所示:$cookies.put('access_token', $rootScope.accesstoken);
$cookies.put('access_token', $rootScope.accesstoken);
$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token
并将相同的令牌添加到http标题中:rootscope
; 顺便说一下,为什么我提到我应该将令牌存储在角度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通常不会发布到基于浏览器的应用程序,因为它们是长期存在的凭据,意味着可供某人使用的时间试图窃取他们的人数大大增加,浏览器存储选项都有其不足之处。
当客户端应用程序想要访问最终用户拥有的受保护资源时,即使用户没有与应用程序交互,刷新令牌也是特别有意义的;通常称为脱机访问。基于浏览器的应用程序的大多数场景仍然暗示用户在线,因此缺少刷新令牌并不是一件大事。