OAuth2的客户端JS库如何维护安全身份验证?

时间:2014-07-13 15:25:30

标签: oauth-2.0 google-oauth hello.js

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

为OAuth2设置JS客户端的难点在于您无法存储客户端密钥,因为它可以在浏览器中广泛访问。即在this SO question评分最高的评论中说:

  

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

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

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

也许我在这里混淆了一些不同的主题,对此主题的任何启示都会受到赞赏。

3 个答案:

答案 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);
            }
        });
相关问题