OAuth2 的客户端 JS 库如何维护安全认证?

Posted

技术标签:

【中文标题】OAuth2 的客户端 JS 库如何维护安全认证?【英文标题】:How do client-side JS libraries for OAuth2 maintain secure authentication? 【发布时间】:2014-09-03 15:27:02 【问题描述】:

我是 OAuth2 的新手,我一直在努力解决一个问题,尽管研究仍然无法掌握。

OAuth2 的 JS 客户端的困难在于您不能存储客户端密钥,因为它可以在浏览器中广泛访问。 IE。在this SO question 中,评分最高的评论说:

“我认为 tokenSecret 和 consumerSekret 参数应该是 秘密!下载到浏览器怎么能保密?!!!”

因此,像 hello.js 或 oauth.io 这样的客户端 OAuth2 框架如何克服这个问题?我知道他们使用服务器端代理(知道 ID 和秘密)来处理他们的请求,但是客户端 JS 代码仍然需要以某种方式告诉代理它是谁。那么是什么阻止任何人从我的网站获取 JS 代码并代表我与代理交谈?

我还找到了Google APIs Client Library for javascript。 AFAIK 那里的客户端代码没有传递秘密。我是否正确理解他们通过预定义的 OAuth 响应地址来管理这个? (以便始终通过预定义的 HTTP 地址返回令牌)。所以即使有人试图通过使用我的 ID 来冒充我的网站,令牌仍然会返回到我的网站吗?

也许我在这里混淆了几个不同的主题,任何关于该主题的光都将不胜感激。

【问题讨论】:

【参考方案1】:

OAuth2 中的某些流不需要机密(例如,implicit 流通常用于基于 JS 的客户端、SPA 等)。不过,并非所有提供商都支持此流程,因此在这些情况下,您需要一个服务器端组件来为您协商,然后处理与您的前端/设备的交互。

无论如何,您都需要用户进行身份验证。 secret 验证客户端(您的应用程序),而不是用户。返回 url(或回调)保护令牌发布到其他地方(仅限您的应用程序)。

这些流程的示例在这里:https://docs.auth0.com/protocols#5

更新: 有一个用于“公共客户端”的特定代码/令牌交换协议增加了额外的安全性:PKCE(它的工作原理在这里:https://auth0.com/docs/protocols#oauth2-pkce-for-public-clients)

【讨论】:

【参考方案2】:

对于 JS 客户端,Google 会验证 JS 源是否与使用客户端 ID 注册的源相匹配。因此,如果有人使用别人的客户端 ID,他们最多只能为他们拥有的帐户获得令牌(这不会很有用)。

一般来说,您永远无法知道谁/什么客户端(或代码)正在与您的服务器通信。您只能看到他们发送的数据。因此,如果其他客户端/代码发送相同的数据包,则您无能为力,通常您不应该关心。您应该关心您在请求中是否有适当的凭据。

【讨论】:

以上是关于OAuth2 的客户端 JS 库如何维护安全认证?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Passport.js 的 Vue.js 客户端和 Express.js 服务器的完整 Oauth2 身份验证流程

第 88 天:OAuth2.0 客户端实战

第88天: OAuth2.0 客户端实战

第88天: OAuth2.0 客户端实战

OAuth2.0 - 使用数据库存储客户端信息 及 授权码

Spring安全中的Oauth2客户端