php - laravel 5.3护照和 Angular 存储访问 token

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

我正在对用户进行身份验证,以使用我自己的api(因此是一个可信的源)。我很难确定的是,在客户端存储return access_令牌的最佳位置在哪里?我是创建一个cookie,还是将数据保存在本地存储中?
我应该只存储访问令牌,我应该记录刷新令牌吗?刷新令牌用于什么?

最佳答案

如果只在客户端存储访问令牌(即使刷新令牌在一定时间后过期),则会更安全,尽管这样做会减少可能的攻击窗口。
这是一种方法(如果要存储访问和刷新令牌):
https://stackoverflow.com/a/18392908/5549377
不过,还有另一种方法。
这样,客户端将只获取访问令牌,刷新令牌对用户完全隐藏。但是为了做到这一点,访问令牌和刷新令牌应该存储在服务器端。最好的地方在数据库里。这就提出了一个显而易见的问题:安全?好吧,答案是你总是可以加密存储在数据库中的数据,并尽可能地保护你的数据库。
创建一个可以存储用户id、访问令牌、刷新令牌甚至会话id的表(用户令牌表)。
在每次登录时,检查user_token表中的user_id下是否存在记录。如果不存在,请请求oauth/令牌,并将访问和刷新令牌存储在user_token表中。
登录成功后,您可以用您的角度编写一个.run函数来请求用户的访问令牌。(请记住,在user_token表中,我们有一个“user_id”列。因此,您可以从laravel中的Auth::id()函数请求筛选当前登录的用户。
一旦找到访问令牌,服务器应仅将访问令牌和访问令牌返回给客户端。
客户机收到访问令牌后,您可以对受'middleware' => 'auth:api'保护的路由进行握手调用,方法是将接收的访问令牌添加到头中,如下所示:$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token;。另外,在执行此操作之后,请确保将相同的标记添加到rootscope变量中,如下所示:$rootScope.accesstoken = data.access_token;
如果握手调用成功,则可以将有效的访问令牌从rootscope添加到如下角度cookie:$cookies.put('access_token', $rootScope.accesstoken);
如果握手调用不成功,则可以请求新令牌。若要请求新令牌,请使用将重定向到单独函数的新路由。此函数将获取当前用户的用户id下的刷新令牌,并从oauth端点请求新的访问令牌(请参阅passport api文档)。完成此操作后,更新“user_tokens”表中用户下的记录,并将新的访问令牌返回给web客户端。在webclient端,将接收到的令牌存储在角度cookie中,如下所示:$cookies.put('access_token', $rootScope.accesstoken);,并将相同的令牌添加到http头中,如下所示:$http.defaults.headers.common.Authorization = 'Bearer ' + data.access_token
顺便问一下,我为什么要说我应该把代币放在角形饼干里。好吧,如果你只把它存储在rootscope上,如果页面刷新,应用程序将不得不再次请求一个令牌,因为在刷新之后,angular rootscope中的任何数据都会丢失。但在有棱角的饼干里,它不是。因此,这就是为什么我建议添加到角饼干。
非常重要:
对于您发出的每个ajax请求,如果请求在代码401(未经授权的访问)下失败,您应该从angular调用request new token函数来调用laravel的request new token函数。一旦成功,如我所述,将新的令牌插入到http头和角度cookie中。
注:
刷新令牌的目的是验证您是否是旧访问令牌的身份验证用户(让我们调用令牌xxx)。
只要访问令牌过期,就可以使用它。一旦你需要告诉服务器你不能使用这个访问令牌xxx并且它已经过期了,那么给我一个新的令牌。当你提出这个请求(给你一个新的令牌)时,服务器应该知道你是前一个访问令牌的合法用户,所以服务器会要求你证明你是合法的。这时,您可以出示刷新令牌并向服务器证明您是合法的。这是刷新令牌的使用。
那么服务器如何通过刷新令牌验证您的合法性呢?
最初,当您请求访问令牌时,会向您提供刷新令牌,以便在这种情况下服务器会知道。
我建议您阅读并了解有关OAuth2.0的更多信息。

关于php - laravel 5.3护照和 Angular 存储访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40497531/

相关文章:

angularjs - $state.go 不是函数

php - 'mysqldump' 未被识别为内部或外部命令

php - 如何使用特定参数 PHP 运行 SQL 脚本

php - 查找导致 elasticsearch 响应变慢的原因

javascript - ie11 中使用 Angular 进行表单验证

angularjs - 使用 ui-sref 指令和 ui-router 将变量传递给抽象父状态

php - 我如何在 laravel Blade 上实现此代码?

php - Laravel 集合总是返回一个对象而不是数组

php - 使用 Eloquent 时 Laravel 5.1 加入问题

php - 使用 CodeIgniter 连接多个表