我为什么要传送`client_secret`来获取`access_token`?

时间:2011-09-12 14:05:44

标签: facebook oauth oauth-2.0 access-token

要从Facebook获取access_token,您必须传送您的app_id,授权请求后收到的code以及您应用的secret_key

为什么 EVER 传输我的密钥?这看起来显然是不安全的。这是OAuth 2.0规范的要求吗?

作为一个相关问题,当我的app_id请求已经签名时,为什么需要传输consumer_key

我有一个正在运行的应用程序,我只是不明白这些要求。

3 个答案:

答案 0 :(得分:2)

这是OAuth 2.0 spec, section 4.1.3的要求。

  

如果客户端类型是机密或已颁发客户端凭据   (或指定其他身份验证要求),客户端必须   使用授权服务器进行身份验证,如中所述   第3.2.1节

section 3.2.1是指section 2.3。具体来说,section 2.3.1说:

  

或者,授权服务器可以允许包括      请求正文中的客户端凭据使用以下内容      参数:

     

<强>的client_id

   REQUIRED.  The client identifier issued to the client during
   the registration process described by Section 2.2.
     

<强> client_secret

   REQUIRED.  The client secret.  The client MAY omit the
   parameter if the client secret is an empty string.

OAuth 2.0确实提供了其他方式,但通过选择这种方法,Facebook完全符合规范。现在为什么 Facebook选择了这种方法,只有Facebook可以回答。

答案 1 :(得分:1)

除了作为Oauth2的要求之外,还需要在此步骤中使用client_secret来验证您确实是您所声称的人。

这一切归结为为什么这个过程就像是......

从安全角度来看,你从第一个请求中获得的'代码'相当薄弱。它可以通过重定向链接劫持它,这是我经常看到没有SSL保护的登陆页面。即使你的网站上有100%的HTTPS,一切都不是完全安全的。有人可以通过查看记录在Web服务器访问日志中的请求URL找到代码。

即使您拥有最严格的安全环境,白金汉宫的这一侧也可以控制您访问服务器,如果您已经使用了几年的技术竞技场,那么您知道有人会在某个时候'存档'您的记录某个不太理想安全的地方。可能是他们在星巴克留下的USB钥匙......

如果您正在使用服务器端API流,那么没有什么可以不避免这种情况。与在客户端浏览器中运行的Javascript不同,您不能在哈希之后添加临时代码以防止它被记录,因为浏览器客户端不会通过哈希标记发送任何带有请求的内容。 JS可以拦截重定向Url,并在Hash标记之后解析出东西,这就是为什么JS Oauth2流只返回access_token而没有额外的中间代码歌曲和舞蹈。在JS方面也没有Client_Secret需要,这很好,因为当你在javascript中放入密码和密钥时,它通常都不赞成。

现在,为防止坏人使用此中间代码获取访问令牌,将发送Client_ID和Client_Secret,以便API服务器可以验证您是谁,并且您拥有授权兑换access_token的代码。没有什么比分享秘密更好!

由于代码在到期之前有一个非常短的使用窗口 - 基本上意味着你将其兑换成一个access_token立即 - 有人窃取代码并试图暴力破坏Client_Secret的危险并不太可能。

短使用窗口和client_secret(当然是在ssl上)的组合提供了一个您稍后与您交换客户端凭据的信息

答案 2 :(得分:0)

注意单词......不推荐。

2.3.1。客户密码

拥有客户端密码的客户端可以使用HTTP Basic    [RFC2617]中定义的认证方案,用于认证    授权服务器。客户端标识符使用    “application / x-www-form-urlencoded”编码算法    附录B,编码值用作用户名;客户端    密码使用相同的算法编码并用作    密码。授权服务器必须支持HTTP Basic    用于验证发布的客户端的身份验证方案    客户密码。

例如(仅用于显示目的的额外换行符):

 Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3

或者,授权服务器可以支持包括    请求体中的客户端凭据使用以下内容    参数:

CLIENT_ID          需要。客户端标识符在发送给客户端期间          第2.2节描述的注册过程。

client_secret          需要。客户的秘密。客户端可以省略          如果客户端密钥是空字符串,则参数。

使用两者在请求体中包含客户端凭据    不建议使用参数,并且应该仅限于无法使用的客户    直接使用HTTP Basic身份验证方案(或其他方法)    基于密码的HTTP身份验证方案)。参数只能    在请求体中传输,不得包含在    请求URI。

例如,使用刷新访问令牌(第6节)的请求    身体参数(带有额外的换行符用于显示目的    只):

 POST /token HTTP/1.1
 Host: server.example.com
 Content-Type: application/x-www-form-urlencoded

 grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
 &client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw

授权服务器必须要求使用TLS,如中所述    使用密码验证发送请求时的第1.6节。

由于此客户端身份验证方法涉及密码,因此    授权服务器必须保护使用它的任何端点    蛮力攻击。