要从Facebook获取access_token,您必须传送您的app_id
,授权请求后收到的code
以及您应用的secret_key
。
为什么 EVER 传输我的密钥?这看起来显然是不安全的。这是OAuth 2.0规范的要求吗?
作为一个相关问题,当我的app_id
请求已经签名时,为什么需要传输consumer_key
?
我有一个正在运行的应用程序,我只是不明白这些要求。
答案 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节。
由于此客户端身份验证方法涉及密码,因此 授权服务器必须保护使用它的任何端点 蛮力攻击。