【发布时间】:2025-12-02 10:10:01
【问题描述】:
我有一个使用 OAuth 1.0a 对使用它的应用程序进行身份验证的 api。它正在替换一个旧的 api,该 api 使用了许多已被弃用的自定义构建和大杂烩调用。
众所周知,OAuth 1.0a 在(客户端)Javascript 中是不安全的,因为它依赖于保密的消费者秘密。这是不可能的,因为源始终可见。
我们有 Chrome、Firefox、IE 和 Safari 的浏览器扩展,将来需要使用这个 api。这些扩展大部分或完全用 Javascript 编写,因此存在安全问题。
这些扩展是内部的,因此可以使用自定义身份验证方法来获取其访问令牌。
我计划实施的内容如下:
- 用户在浏览器中登录网站。
- 网站向他们发送带有会话密钥的 cookie。
- 然后我们的扩展程序获取该 cookie 并将其传递给 api。
- api 验证它是一个有效且活动的会话,并向扩展发出其访问令牌。
- 这些令牌在过期前最多可以使用一小时。
- 对 javascript 发布的 cookie 的速率限制也将更低。
它在以下假设下运行:
- 如果其他应用程序可以访问您的 cookie,那么他们无论如何都可以在网站上冒充您,因此访问 api 没有什么不同。
- 所有身份验证方法仍由我们控制。
- 令牌的定期到期意味着如果它们被泄露,那么利用的时间是有限的。
我的问题是,这是一种限制对 api 访问的安全方法吗? 还有更好的吗?
一些笔记。 我知道 chrome 扩展可以请求访问给定站点的 cookie 的权限。我相信 Firefox 扩展也可以做到这一点。
显然,我们不希望通过任何页面上的 javascript 访问我们的 cookie,否则我们会将自己暴露于 XSS 攻击,因此只能通过扩展程序访问它们。
【问题讨论】:
-
嗯...在我看来,扩展方法本质上是不安全的,因为您的用户可以简单地创建自己的扩展或其他访问 api 的方法。
-
但他们仍然需要通过网站进行身份验证。如果他们可以从该站点获取 Cookie,则无论如何他们都可以访问该站点。所以我的方法只会和网站登录一样不安全。
-
如何将 OAuth 令牌存储在 LocalStorage 中? LocalStorage 只能由客户端浏览器读取,不会在 HTTP 请求标头中发送。
-
但这里的问题不在于存储令牌本身。它正在使用 api 进行身份验证以获取 OAuth 令牌。
-
啊,谢谢你的解释。
标签: javascript security oauth oauth-provider browser-extension