Facebook 为什么我要传输'client\u secret'以获得'access\u令牌'?

Facebook 为什么我要传输'client\u secret'以获得'access\u令牌'?,facebook,oauth,oauth-2.0,access-token,Facebook,Oauth,Oauth 2.0,Access Token,为了从Facebook获得访问令牌,您必须传输您的应用程序id、授权请求后收到的代码以及应用程序的密钥 为什么我要传送我的密钥?这显然是不安全的。这是OAuth 2.0规范的要求吗 作为一个相关问题,当我的请求已经用我的消费者密钥签名时,为什么我需要发送应用程序id 我有一个可用的应用程序,我只是不理解这些要求。这是的要求 如果客户端类型是机密的或已颁发客户端凭据 (或指定的其他身份验证要求),客户必须 使用授权服务器进行身份验证,如中所述 第3.2.1节 指的是。具体来说,他说: 或者,授权服

为了从Facebook获得访问令牌,您必须传输您的
应用程序id
、授权请求后收到的
代码以及应用程序的
密钥

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

作为一个相关问题,当我的请求已经用我的
消费者密钥签名时,为什么我需要发送
应用程序id


我有一个可用的应用程序,我只是不理解这些要求。

这是的要求

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

指的是。具体来说,他说:

或者,授权服务器可以允许包括 使用以下命令在请求正文中创建客户端凭据 参数:

客户id

   REQUIRED.  The client identifier issued to the client during
   the registration process described by Section 2.2.
客户机密

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

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

除了作为Oauth2的一项要求外,在这一步中还需要使用客户机密来验证您是否确实是您所声称的人

这一切都归结为为什么这个过程是这样的

从安全角度来看,您从第一个请求返回的“代码”本身非常脆弱。它可能在重定向链接中被劫持,我经常看到重定向链接在没有SSL保护的情况下转到登录页。即使你对你的网站进行了100%的HTTPS考虑,但一切都不是完全安全的。有人可以通过查看记录在web服务器访问日志中的请求URL来找到代码

即使你在白金汉宫这边拥有最严密的安全环境来控制对服务器的访问,如果你已经参加了几年的科技竞技表演,你知道有人会在某个不太安全的地方“归档”你的日志。可能是他们留在星巴克的USB钥匙上

如果您使用的是服务器端API流,那么没有什么可以避免这种情况。与在客户端浏览器中运行的Javascript不同,您不能在散列之后添加临时代码以防止其被记录,因为浏览器客户端不会在请求中发送任何超过散列标记的内容。JS可以截获重定向Url,并解析出散列标记后的内容,这就是为什么JS Oauth2流只返回access_令牌,而不返回额外的中间代码song and dance。JS端也不需要客户端密码,这很好,因为当您将密码和密钥放入javascript中时,它通常是不受欢迎的

现在,为了防止这个中间代码被坏人用来获取访问令牌,客户端ID和客户端机密被发送出去,这样API服务器就可以验证您是您声称的那个人,并且您有权将代码兑换为访问令牌。没有什么比共同的秘密更重要的了

由于该代码在到期前的使用时间很短——基本上是为了让您立即将其兑换为访问令牌——因此,有人窃取代码并试图强行窃取客户机密的危险不大


短时间的使用窗口和客户机机密(当然是通过ssl)的结合提供了一个可供您稍后与客户机凭据交换的密码。请注意。。。。不推荐

2.3.1。客户端密码

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

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

或者,授权服务器可以支持包括 使用以下命令在请求正文中创建客户端凭据 参数:

客户识别码 必修的。在运行期间颁发给客户端的客户端标识符 第2.2节描述的注册过程

客户机密 必修的。客户的秘密。客户可以省略 参数,如果客户端密码是空字符串

使用两个 不建议使用参数,应仅限于无法访问的客户端 直接使用HTTP基本身份验证方案(或其他 基于密码的HTTP身份验证方案)。参数只能 在请求正文中传输,不得包含在 请求URI

例如,使用以下命令刷新访问令牌的请求(第6节) 主体参数(带有用于显示的额外换行符 仅限):

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

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

在请求访问令牌时,中不要求发送密钥。
客户端密钥
是否应与
消费者密钥
不同?我不明白什么是
client\u id
client\u sec
 Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3
 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