【问题标题】:Facebook authentication, return_uri, and my local uriFacebook 身份验证、return_uri 和我的本地 uri
【发布时间】:2014-03-30 02:07:56
【问题描述】:

我在我的网站上使用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 提供“传递”参数,但在这里我做不到。

【问题讨论】:

  • 为什么尝试获取访问令牌时会失败?您是否在调用身份验证对话框和调用以交换 code 以获取访问令牌时使用完全相同的 redirect_uri?
  • @Igy,是的,它在抱怨“验证验证码时出错。请确保您的 redirect_uri 与您在 OAuth 对话请求中使用的相同”。但是,我已确保调用之间的 URL 相同。当我不将 local_redir 作为参数附加时,它可以工作。
  • 我假设您正在使用 PHP SDK 来处理登录等内容?如果是这样,那么已经有一个会话 - 那么为什么不在用户单击您网站上某处的链接/按钮“使用 Facebook 登录”的位置时将 URL 存储到会话中的“原始页面” - 然后就使用从会话中读取的值完成 FB 登录后将它们重定向到该页面?这将避免在重定向 URI 中突然出现附加参数的任何问题,而 Facebook 似乎对此表示反对。
  • @CBroe,这会起作用,事实上这是我的备用计划。我试图避免使用会话。似乎应该有一种方法可以在没有会话的情况下做到这一点,但可能并不容易。
  • “当我不将 local_redir 作为参数附加时,它可以工作。” – 根据我读过的一些内容,Facebook 对 GET 参数可能会很讨厌有时。您是否尝试使用 http://example.com/login/facebook/local_redir/http://example.com/users/original/page 或其他形式的重定向 URI,将所需参数作为 URL path 的一部分而不是作为查询字符串参数传递? (可能需要一些服务器端重写,否则才能使其正常工作。)

标签: facebook facebook-oauth


【解决方案1】:

好的,找到了一个可行的解决方案。显然 Facebook 不喜欢 GET 参数或嵌入在 URL 中的 URL(即使编码正确)。结合来自 cmets 的 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
                                      ));

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。

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

    这些都不起作用。

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-24
      • 2018-06-30
      • 2015-08-10
      • 2021-07-07
      • 1970-01-01
      • 2019-05-22
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多