我是OAuth2的新手,虽然研究仍然无法掌握,但我一直在努力解决这个问题。
为OAuth2设置JS客户端的难点在于您无法存储客户端密钥,因为它可以在浏览器中广泛访问。即在this SO question评分最高的评论中说:
“我认为tokenSecret和consumerSekret参数应该是 秘密!下载到浏览器后他们怎么能保密?!!!“
因此,hello.js或oauth.io等客户端OAuth2框架如何解决此问题?我知道他们使用服务器端代理(知道ID和秘密)来处理他们的请求,但是客户端JS代码仍然需要以某种方式告诉代理人它是谁。那么是什么阻止任何人从我的网站上获取JS代码并代表我与代理人交谈?
我也找到了Google APIs Client Library for JavaScript。 AFAIK那里的客户端代码没有传递秘密。我是否正确理解他们是通过预定义的OAuth响应地址来管理的? (以便始终通过预定义的HTTP地址返回令牌)。所以,即使有人试图使用我的ID冒充我的网站,代币仍会返回我的网站?
也许我在这里混淆了一些不同的主题,对此主题的任何启示都会受到赞赏。
答案 0 :(得分:19)
OAuth2中的流量不需要保密(例如implicit
流通常用于基于JS的客户端,SPA等)。并非所有提供程序都支持此流程,因此在这些情况下,您需要一个服务器端组件,为您协商,然后处理与前端/设备的交互。
在任何情况下,您都需要用户进行身份验证。 secret
验证客户端(您的应用),而不是用户。返回URL(或回调)保护令牌在其他地方(仅限您的应用程序)发布。
这些流程的示例如下:https://docs.auth0.com/protocols#5
<强>更新强> “公共客户端”有一个特定的代码/令牌交换协议,可以增加额外的安全性:PKCE(它是如何工作的:https://auth0.com/docs/protocols#oauth2-pkce-for-public-clients)
答案 1 :(得分:4)
对于JS客户端,Google确实确认JS源与使用客户端ID注册的JS源相匹配。因此,如果有人使用其他人的客户端ID,他们最多只能获得他们拥有的帐户的令牌(这不会非常有用)。
一般情况下,您永远无法知道谁/哪个客户端(或代码)与您的服务器通信。您只能看到他们发送的数据。因此,如果其他客户端/代码发送相同的数据包,则无法做任何事情,一般情况下您不应该关心。您应该关心您在请求中拥有适当的凭据。
答案 2 :(得分:-6)
整个混乱是关于我们为获取访问令牌而传递的参数。我做了一个小代码库。 @ git你可以看看。
https://github.com/dev-sandeep/oauth-js
var deferred = jQuery.ajax({
url: '',//Access URL goes here
method: 'POST',
dataType: 'text',
data: {
scope: scope, //your scope
client_id: clientId,//client id
client_secret: clientSecretId,//client secret id
grant_type: 'client_credentials'
},
headers: {
'Accept': 'application/json, application/x-www-form-urlencoded',
'Content-Type': 'application/x-www-form-urlencoded',
},
complete: function (xhr, data) {
/* YOUR WORK STARTS HERE! */
console.warn(xhr, data);
}
});