1

我在我的网站上使用Facebook 身份验证,每个页面的导航菜单中都有“使用 Facebook 登录”按钮。因此,用户应该能够通过 facebook 登录并一键返回到他们所在的页面。Facebook 提供了 return_uri 参数,该参数在我的网站上设置为 /login/facebook,它处理针对 facebook API 的所有身份验证。但是,一旦我完成了这个逻辑并且我登录了用户,我需要知道他们最初在哪个页面上,以便我可以重定向他们。

我尝试将我的 return_uri 参数传递为:

http://example.com/login/facebook?local_redir=http://example.com/users/original/page

(当然所有的问号和正确编码之后)所以当我得到回复时,我知道他们的原始页面是什么。当我尝试获取访问令牌时失败。我基本上需要一种方法来为 facebook 提供一个“传递”参数,但在这里我很短。

4

2 回答 2

0

好的,找到了一个可行的解决方案。显然 Facebook 不喜欢 GET 参数或嵌入在 URL 中的 URL(即使编码正确)。结合 CBroe 从评论中的建议,并将 URL 转换为 base 64 字符串,可以解决问题:

string returnUrl = Convert.ToBase64String(
                            System.Text.Encoding.ASCII.GetBytes(
                                HttpContext.Current.Request.Url.ToString()
                          ));

...然后将 return_uri 参数设置为:

HttpUtility.UrlEncode("http://example.com/login/facebook/local_redir/" + returnUrl);

当控制器收到从 Facebook 返回的请求时,它只是解码 local_redirect 之后的 URL,瞧!

string decodedRedirectUrl = System.Text.Encoding.ASCII.GetString(
                                        Convert.FromBase64String(
                                            local_redir
                                      ));
于 2013-05-26T04:16:05.760 回答
0

我有同样的问题。

我尝试了所有“更改 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST,将 trustForwarded 设置为 true,将 allowSignedRequest 设置为 false,......”

这些都没有奏效。

底线 - 我传递给 facebook 以构建 auth url 的 return_uri 在域名中有大写和小写字符。身份验证完成后,facebook 将浏览器发送回该上/下域名,但在 fb 代码本身中,当它构建当前 URL 以确保它与 return_uri 参数匹配时,它使用内置的 php 数组,如 $ _SESSION,它将只提供小写版本 - 因此 return_uri 实际上与当前 URL 不匹配。

解决方案 - 在您拥有域名的任何地方,将其设置为小写。

于 2014-03-29T18:07:56.737 回答