在Javascript中保护OAuth

Chr*_*lij 20 javascript security oauth browser-extension oauth-provider

我有一个api,它使用OAuth 1.0a来验证使用它的应用程序.它正在取代一个旧的api,它使用了一些被弃用的定制和hodge-podge调用.

众所周知,OAuth 1.0a在(客户端)Javascript中并不安全,因为它依赖于保密的消费者秘密.这是不可能的,因为源始终是可见的.

我们为Chrome,Firefox,IE和Safari提供了浏览器扩展,将来需要使用此API.这些扩展都是大部分或完全用Javascript编写的,因此也存在安全性问题.

这些扩展是内部的,因此可以使用自定义身份验证方法来获取其访问令牌.

我计划实施的内容如下:

  • 用户在浏览器中登录网站.
  • 该网站向他们发放带有会话密钥的cookie.
  • 我们的扩展然后获取该cookie并将其传递给api.
  • api验证它是一个有效的活动会话并发布其访问权限的扩展.
  • 这些令牌在到期前最多持续一小时.
  • javascript发布的cookie也会有较低的费率限制.

它在以下假设下运作:

  • 如果另一个应用程序可以访问您的cookie,那么无论如何他们都可以在网站上冒充您,因此访问api也不例外.
  • 所有身份验证方法仍然通过我们的控制.
  • 令牌的定期到期意味着如果它们被泄露,那么剥削的时间有限.

我的问题是,这是一种限制访问api的安全方法吗?还有更好的吗?

几个笔记. 我知道有一个事实,Chrome扩展可以请求访问您的给定网站的cookie的权限.我相信firefox扩展也可以这样做.

显然,我们不希望我们的cookie可以通过任何页面上的javascript访问,否则我们会暴露自己的XSS攻击,因此它们只需要通过扩展来访问.

Ted*_*ddy 8

我写了一个网站,通过javascript库为OAuth登录OAuth.这是工作流程:

  1. 仅在具有LocalStorage的浏览器上支持OAuth
  2. 登录表单将检查LocalStorage的OAuth密钥,并在存在OAuth密钥时自动尝试OAuth登录.
  3. 登录表单上有一个"记住我"的复选框,因此用户可以在登录时为他们创建OAuth令牌.
  4. 成功登录/记住我会:
    • 查找或创建名称等于User Agent的ClientApplication,并在必要时创建令牌
    • 在HTML响应中使用javascript标记进行响应.javascript标记将调用javascript函数,并将标记作为参数传递.此功能会将OAuth令牌保存到LocalStorage.
  5. OAuth登录尝试失败将:
    • 在HTML响应中使用javascript标记进行响应.javascript标记将调用javascript函数来清除OAuth令牌的LocalStorage设置.这将阻止其他OAuth登录尝试

这个过程还有一些细节,如果你想要我,我可以告诉你更多关于它的信息.

  • 虽然这是一个很好的答案,但它并没有解决我的问题.我的问题是我的分发令牌的方法是否安全.它与存储它们无关.这是服务器端,而不是客户端问题. (5认同)