Facebook身份验证,return_uri和我的本地uri

时间:2013-05-25 14:45:42

标签: facebook facebook-oauth

我在我的网站上使用facebook authentication,每个页面的导航菜单中都有“使用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提供一个“传递”参数,但是我在这里很简单。

2 个答案:

答案 0 :(得分:0)

好的,找到了一个有效的解决方案。显然Facebook不喜欢GET参数或URL中嵌入的URL(即使编码正确)。结合CBroe的评论建议,并将URL转换为基数为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
                                      ));

答案 1 :(得分:0)

我遇到了同样的问题。

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

这些都不起作用。

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

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