【问题标题】:Secure way to communicate OAuth token to javascript client将 OAuth 令牌传送到 javascript 客户端的安全方式
【发布时间】:2013-02-26 12:50:21
【问题描述】:

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

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

一步一步来:

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

这有意义吗,还是会在系统中留下大量漏洞?特别是,在网络上拥有一个基于设置的 cookie 分发身份验证令牌的资源是不是很疯狂?

【问题讨论】:

    标签: javascript ajax rest oauth oauth-2.0


    【解决方案1】:

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

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

    • (只是将该评论放在上下文中:有一次我从一个站点弹出一个会话令牌,发现我的家庭地址和电话号码在那里。Ack!)

    • 我已经看到在浏览器 javascript 中对请求进行 HMAC 签名的代码,但它带有一个巨大的免责声明:不要在生产中使用它。签名方案要求客户端(javascript)知道“秘密”字符串,但浏览器/javascript 是如此不安全,以至于将您的秘密字符串交给世界​​。

    但是,如果您通过 HTTPS 进行所有通信,那么您实际上只是对熟悉的将会话令牌作为 cookie 传递的方案进行了 OAuth 扭曲。

    【讨论】:

    • 我本来打算使用 SSL 的,我应该提一下的。
    • 我同意这个答案,并且正在考虑实施这种方法,但还有另一种方法值得一提。您可以使用 JavaScript 的“隐式”授权,然后使用访问令牌调用您的 Web 应用程序以生成会话 cookie。从那时起,会话 cookie(与服务器端的访问令牌相关联)将用于对 Web 应用程序进行身份验证,而访问令牌将用于对 REST API 进行身份验证。但是,您如何在此处处理刷新令牌(可能将其存储在可用的本地存储中?)。
    猜你喜欢
    • 2018-03-15
    • 2019-11-13
    • 2020-06-08
    • 2019-01-27
    • 2012-06-30
    • 2013-02-03
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多