2

因此,当使用 Facebook 登录时,事实证明,如果您在重定向到您的应用程序的 URL 上设置response_typetoken然后code%20token“响应数据作为 URL 片段包含”。说真的,为什么?什么时候对任何人有用?

无论如何,我希望这在某种程度上与安全相关,并且它的存在不是为了惹恼人们,但我想知道是否有办法禁用它,因为我使用的是 Angular 并且它是真实的用 hashbangs 处理 url 很痛苦。

如果我只设置 a response_typeof code,代码将作为一个漂亮而干净的查询参数返回,但我想同时接收这两个参数以执行额外的验证。有没有办法改变这种行为?谢谢。

编辑: 事实证明,设置 a response_typeofcode返回 #/ =在 url 的末尾,所以没有办法得到一个干净的查询字符串。已经确定没有办法改变这种行为,但我仍然有兴趣找出 Facebook 这样做的原因。它与安全有关吗?这些 url 片段的目的是什么?

4

2 回答 2

6

答案

对于您的第一个问题,我想您会token在浏览器中处理所有内容而不是在服务器上处理时使用。

对于您的主要问题,据我所知,您无法更改 Facebook 重定向成功授权的方式。Facebook 不会将令牌作为干净的查询参数提供给您。如果您使用tokenor code token,您想要的将在哈希片段中。对不起。


注意:这对您来说可能不是问题。我不确定你想要什么“附加验证”,但是当你使用 时code token,交换结果代码会得到一个与你刚刚嵌入在 URI 中的不同的令牌。两者现在都有效,并将分别过期。确实,您可能需要代码令牌;两者都不会帮助您,因为它们没有链接。


使用所有三种方法的示例:

如果你设置response_typecode会被重定向到类似的东西:

http://example.com/redirect_uri?state=thestatepassed&code=AQDN9E9GYjA8NbyCt
87_jV5vHnCQylNxmBswo6Z1BsrR7lmTPom6wjrzfan6P4GBLDt3EQrfPg0xSLoMLxBBfscsyfSY
JNM2vu9OoqEQXXSJCTUq_fMpUwqkYbCHp-GAqL4H1ymbMz7zPKAG61V9BtKTSuez39yhawOu7l-
6ww4thP41Ka9PVcknTQ6fPjPXKYSyxEmANps9zevCPFsXpBZCO7_dms65-ZZuG2wVBd16gFnBZH
q8EY0qih6-9o61wXh7bBvVPVSZ2im7Oj1nx47YgDpbD3X0XdlVhUoGYmBdER9hNmIC2PmmY7VAo
PlYCZc#_-_

从那里,您需要通过 Facebook 的 OAuth 端点交换代码以接收访问令牌。然后可以针对 Facebook API 使用访问令牌。

如果你设置response_typetoken会被重定向到类似的东西:

http://example.com/redirect_uri#access_token=CAACYnSxGEhsBAJBg0ohZBhAf7pKEU
sm5ytZAZBzKjISFuRun2ZByZCqEsxrVIgtiO7iIlJZBBbGm6fRPQXItZCX6YgjPknUBsr78tJtv
W6fySULrUo9vdW57ZCMUUIlNaeZAcU8DzUXKmFpgotOyhE3jXYz1c3eu00Aii0AZBsPrtrwjpwQ
mV8VYQNiqKZBIsqOrIwZD&expires_in=4168&state=thestatepassed

您拥有调用 Facebook API 所需的一切。返回的访问令牌是有效的,但如果您在服务器端执行某些操作,则可能应该针对 Facebook 的令牌检查端点进行检查。(真的,在那一点上,只需使用code。我从来没有这样做过,祝你好运。)

如您所述,访问令牌现在包含在 url 的哈希片段中。

如果你设置response_typecode token会被重定向到类似的东西:

http://example.com/redirect_uri#code=AQAtzsjPivFPsJ538KFlPuhLaK6pDMlrGDiwmi
KDcpgNfWrO1EdX5i6zK_Op2D0QDEXZLyifXxh4TSeBZCWhnkl7YV1LMyEkbPURAWSoqRoeG7tfM
4nB4nDAHOK0H9umb0KnoypRT1pP05FJKhl2QjpCJrPPFDHl6y-1X9ZMj1uVHtmPNi4tG_6QAbuL
RaGadBkekb22uJ0iwSrWc9OKi6ET70lCTYb18hbwUkzHXtTq12nNEdsDJ7Ku2wEBwMygFwErYDX
CrnPoFoah_z0UPCfv3XZLy98Dhlzw_lnx8nnCB-PCppOWRqmydvQJehPd86k&access_token=C
AACYnSxGEhsBALXHRQwfm4UoauRlZBJDVpZCiM6ZCuM3bE965F5JVBfBB8inTFdhfJ5obnonSqa
m3v8FbWhHXrhRSx4ugwAmmDaWyxmPELWqSrkrDO5ueTUXhhjiEZBTd7HjCVCSOXXhOSo3DjEVSC
lOaZBfqmXsprYyc6LJC39sroCcHYCZCv&expires_in=5183426&state=thestatepassed

现在你有一个访问令牌一个代码(过期适用于令牌,而不是代码)。如前所述,该代码可以以通常的方式交换访问令牌,但返回的访问令牌将不同于您刚刚嵌入 URI 中的访问令牌。

但是,同样,您关心的是散列片段。


请参阅$location 上的 AngularJS 文档以访问哈希。比我更有知识的人可以谈论它如何与路由一起工作以及如何最好地抓取参数。

于 2013-10-04T09:09:06.840 回答
0

那么今天我遇到了同样的情况并设法以一种我可以从我的服务器获取访问令牌的方式解决它。

使用我通过以下网址 response_type=code调用代码后:GEThttps://graph.facebook.com/v3.2/oauth/access_token?app_id=MY_APP_ID&code=MY_CODE&client_id=MY_APP_ID&client_secret=MY_APP_SECRET&redirect_uri=YOUR_LOGIN_REDIRECT_URI

此路由access_token以这种方式返回一个带有参数的 JSON 响应:

{
   "access_token": "ABAECAEFAEFAEA...",
   "type": "bearer",
   "expires_in": 838383838
}

所以你去了:)我希望这对你也有用

于 2018-11-23T16:20:12.393 回答