草庐IT

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

coder 2024-04-18 原文

我正在对用户进行身份验证,以使用我自己的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/

有关php - laravel 5.3护照和 Angular 存储访问 token的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  5. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  6. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  7. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  8. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  9. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  10. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

随机推荐