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

38

我对OAuth2还很陌生,遇到了一个问题困扰我,即使做了研究仍然无法理解。

在JS客户端使用OAuth2的困难之处在于无法存储客户端密钥,因为它将在浏览器中广泛访问。例如,在这个SO问题中,最高评分的评论说:

“我认为tokenSecret和consumerSekret参数应该是秘密的!当它们被下载到浏览器时,它们如何保持秘密?!!!”

那么像hello.jsoauth.io这样的客户端OAuth2框架如何解决这个问题?我知道它们使用服务器端代理(知道ID和密钥)来进行请求,但是客户端JS代码仍然需要以某种方式告诉代理它是谁。那么有什么方法可以防止任何人从我的网站上获取JS代码并代表我与代理通信吗?

我还发现了Google APIs Client Library for JavaScript。据我所知,客户端代码在那里不传递密钥。我是否正确地理解了它们通过具有预定义的OAuth响应地址来管理这一点?(以便令牌始终通过预定义的HTTP地址返回)。因此,即使有人试图通过使用我的ID冒充我的网站,令牌仍将返回到我的网站上?

也许我在混淆几个不同的主题,任何关于这个问题的帮助都将不胜感激。

2个回答

22

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

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

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

更新:针对“公共客户端”有一个特定的代码/令牌交换协议可以增加额外的安全性:PKCE。


4
在JS客户端的情况下,Google会验证JS来源是否与客户端ID注册的匹配。因此,如果有人使用别人的客户端ID,最多只能获得自己拥有账户的令牌(这对他们来说没有什么用处)。
通常情况下,您永远无法知道哪个客户端/代码正在与您的服务器通信。您只能看到他们发送的数据。因此,如果其他客户端/代码发送相同的数据包,则您无能为力,并且通常不应关心。您应该关心请求中是否有适当的凭据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接