Facebook OAuth和重定向URI

Facebook OAuth和重定向URI,facebook,oauth-2.0,google-oauth,google-openid,openid-connect,Facebook,Oauth 2.0,Google Oauth,Google Openid,Openid Connect,查看Google OpenId connect和Facebook登录,我注意到Facebook总是在浏览器中点击“重定向URI”。更详细地解释一下-当用户遵循表单的链接时 https://www.facebook.com/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri} 他/她总是被重定向到{redirect uri}指定的URL。然后,此URL包含可交换为访问令牌的“代码” 谷歌也有类似的方法,但当使用“服务器流”

查看Google OpenId connect和Facebook登录,我注意到Facebook总是在浏览器中点击“重定向URI”。更详细地解释一下-当用户遵循表单的链接时

https://www.facebook.com/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}
他/她总是被重定向到{redirect uri}指定的URL。然后,此URL包含可交换为访问令牌的“代码”

谷歌也有类似的方法,但当使用“服务器流”时,{redirect uri}会被谷歌的服务器“命中”。这样,需要交换访问令牌的代码永远不会显示给用户

FB的方法似乎不太安全,因为访问代码实际上可能最终落入攻击者手中

  • 有没有一种方法可以让FB将代码发送到重定向URI,而不是实际重定向客户端?就像谷歌做的那样
  • 有人能很好地解释为什么FB没有类似“服务器流”的行为,而只有“隐式流”吗

  • 你应该从服务器获取代码,然后使用它,连同你的应用程序密码,在Facebook上交换访问令牌。客户端是否可以看到这一点并不重要,因为如果没有应用程序机密,这些代码是无用的。应用程序的秘密保存在您的服务器上,永远不会向客户端透露。

    “因为访问代码实际上可能最终落入攻击者手中”——这会在哪里,攻击者会在哪里干扰该过程?要将代码交换为令牌,还需要应用程序机密——攻击者从哪里获得?如果你的答案中有任何一部分包含“他以某种方式入侵了我的服务器/我的服务器端代码”——那么另一种方法,即你服务器上的脚本被谷歌服务器“命中”,绝不是“更安全的”。好吧,这是一种假设。理论上,攻击者可以在屏幕上拍摄受害者的照片,如果屏幕足够大,代码就会出现在屏幕上。如果攻击者是某个开发团队的成员,则他/她可能是某个开发团队的成员,并且可以访问密钥。不太可能发生,但我见过这样的攻击(虽然不是通过FB而是通过其他服务)。一旦代码被你的应用程序交换为令牌,它就无法再次使用……因此,你的攻击者不仅需要你描述的那些非常普通的情况,他也必须很快…可能性很小。我认为你的用户在枪口下被迫放弃他们的证书的可能性比这更大。