为什么不是来自Javascript的OAuth所需的客户端密钥?

时间:2017-01-18 08:35:51

标签: javascript google-api google-drive-api google-oauth google-api-js-client

好消息是,我通过Javascript访问了official tutorial关于访问Google Drive REST API的工作。但是,代码中使用了client_id client_secret

/**
* Check if current user has authorized this application.
*/
function checkAuth() {
 gapi.auth.authorize(
   {
     'client_id': CLIENT_ID,
     'scope': SCOPES.join(' '),
     'immediate': true
   }, handleAuthResult);
}

在注册应用程序时,我获得了一个从未使用过的client_secret。是否client_secret auth_token请求按照herehere的说明发送client_id

正如下面的评论所述,我完全理解client_secret是公开的,而不是client_secret。让我感到惊讶的是,尽管没有使用auth_token获取localhost:8000,但Google的OAuth 2.0如何运作。不是OAuth 2.0规范强制要求的吗?什么阻止恶意应用冒充合法的应用?

我可以将EventArrived设置为我的Javascript来源。

enter image description here

1 个答案:

答案 0 :(得分:0)

客户端ID和客户端密钥都用于标识您的应用程序。客户端ID是公共信息,可以向用户显示。虽然秘密必须保密,否则任何人都可以有效地使用您的申请凭证。

JavaScript是客户端,因此如果您在页面上查看源代码,则可以看到客户端ID。如果您的代码也包含了秘密,那么他们也会看到它并且能够使用它。

我怀疑这就是我们需要使用JavaScript的原因,它会增加额外的安全层,而不是在JavaScript应用程序中使用秘密。

RFC6749

  

授权服务器向注册客户端发出客户端      identifier - 表示注册的唯一字符串      客户提供的信息。客户端标识符不是      秘密;它暴露给资源所有者,不得使用      单独进行客户端验证。客户端标识符是唯一的      授权服务器。

英语:Google开发者控制台注册应用程序(客户端),创建一个唯一的字符串来标识该客户端(项目)。客户端ID不是秘密,应该显示给数据的所有者。

4.1. Authorization Code Grant就我所见,客户端secrete不是授权代码交换的必需部分。