jjzjj

javascript - 将 OAuth token 传递给 JavaScript 客户端的安全方式

coder 2024-12-27 原文

我目前正在设计一个以 REST API 为中心的多平台应用程序(客户端将包括内部开发的移动应用程序,以及一个 AJAX 重型 javascript 客户端)。由于将来 API 可能会向第三方开放,因此我正在考虑使用 OAuth 2.0 对 API 进行身份验证和授权。

我正试图解决这种安排的一些安全问题,尤其是与 javascript 客户端有关的问题。我不希望这个客户端表现得像第三方客户端那样,有一大堆重定向和弹出窗口之类的东西,这是大多数 OAuth 文档似乎关注的重点。由于它将从我自己的域交付,我认为 webapp 的服务器端可以是实际的客户端,并存储客户端 secret 和刷新 token ,而 javascript 在需要时从服务器检索新的身份验证 token 。

一步一步的形式:

  1. 用户使用非 ajax html 表单登录,生成存储在服务器端的身份验证和刷新 token 。这会设置一个仅限 HTTP 的登录 session cookie。
  2. javascript 客户端代码在登录后发送到用户的浏览器。
  3. javascript 客户端向作为其自身应用程序一部分(而非 REST api 的一部分)的资源发出请求以检索 token 。 session cookie 确保客户端是真实的,也会检查引用者。返回授权 token 。
  4. javascript 客户端使用 REST API 验证 token 。
  5. 客户端现在可以使用 token 向 REST API 发出请求,直到它过期。
  6. 如果授权 token 过期或页面关闭并重新打开,javascript 客户端可以请求一个新 token 。只要登录 session cookie 仍然有效,Web 应用程序的服务器端就会负责刷新 token 并发送新 token 。

这是否有意义,还是会在系统中留下巨大漏洞?特别是,在 Web 上拥有一种根据设置的 cookie 分发身份验证 token 的资源是不是很疯狂?

最佳答案

只需确保与浏览器的任何通信都是 HTTPS,这样中间的任何人都无法窃取您的 token 。并在您的身份验证 cookie 上设置“安全”标志。

  • 现在大多数浏览器授权方案都归结为在 cookie 中传递的 session token 。 OAuth 2 方案领先几步,因为 a) token (可以是)内部没有危险用户信息的哑 token ,以及 b) 它们会过期。

  • (只是把评论放在上下文中:有一次我从一个网站弹出一个 session token ,发现里面有我的家庭住址和电话号码。确认!)

  • 我见过在浏览器 javascript 中对请求进行 HMAC 签名的代码,但它带有一个巨大的免责声明:不要在生产中使用它。签名方案要求客户端 (javascript) 知道一个“ secret ”字符串,但浏览器/javascript 非常不安全,相当于将您的 secret 字符串交给全世界。

但是,如果您将所有通信都保留在 HTTPS 上,那么您实际上只是对熟悉的将 session token 作为 cookie 传递的方案进行了 OAuth 调整。

关于javascript - 将 OAuth token 传递给 JavaScript 客户端的安全方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15069151/

有关javascript - 将 OAuth token 传递给 JavaScript 客户端的安全方式的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  3. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  6. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  7. ruby - 如何将 Puma::Configuration 传递给 Sinatra? - 2

    这是我的网络应用:classFront我是这样开始的(请不要建议使用Rack):Front.start!这是我的Puma配置对象,我不知道如何传递给它:require'puma/configuration'Puma::Configuration.new({log_requests:true,debug:true})说真的,怎么样? 最佳答案 配置与您运行的方式紧密相关puma服务器。运行的标准方式puma-pumaCLI命令。为了配置puma配置文件config/puma.rb或config/puma/.rb应该提供(参见examp

  8. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  9. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  10. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

随机推荐