【问题标题】:facebook error 'Error validating verification code'facebook错误'验证验证码错误'
【发布时间】:2011-05-22 03:55:32
【问题描述】:

非常奇怪的错误。我使用 gide http://developers.facebook.com/docs/authentication/。所以我向fb创建请求并传递redirect_uri。我在本地主机上使用测试站点。所以如果我通过了

redirect_uri=http://localhost/test_blog/index.php

它工作正常,但如果我通过了

redirect_uri=http://localhost/test_blog/index.php?r=site/oauth2

它不想工作。我尝试使用

redirect_uri= 。 urlencode('http://localhost/test_blog/index.php?r=site/oauth2)

但不起作用。 我试着解释一下。我成功获取代码,但是当我访问 https://graph.facebook.com/me?access_token 时出现错误“验证验证码错误”。我检查过,错误在 ?r=site/oauth2 但我需要传递一些参数 有人可以帮助我吗? 我阅读了http://forum.developers.facebook.net/viewtopic.php?id=70855 的帖子,但对我没有任何帮助

【问题讨论】:

标签: php facebook urlencode


【解决方案1】:

我不确定它是否会有所帮助,但我建议只对 url 中的值进行编码。不是全部。例如:

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');

【讨论】:

  • 这个对我有用 - 它必须是导致问题的参数中的“/” - 谢谢
【解决方案2】:

我有 pb 并最终修复它,在 url 中添加 type=client_cred 参数。

【讨论】:

  • 我不会推荐这个。 type=client_cred 参数用于不同的用例。
【解决方案3】:

据我所知,这里的问题是redirect_uri 必须以'/' 结尾并且不包含'?'或其他特殊字符。我认为这就是您收到“验证验证码错误”的原因。此错误仅在您使用 file_get_contents() 时出现,而不是在使用 facebook php 库时出现。 这是php的解决方法,不知道其他SDK会不会出现这个错误。

【讨论】:

  • 删除?从网址为我解决了这个问题。谢谢。
【解决方案4】:

目前(截至 2011 年 3 月)关于什么是有效的 redirect_uri 存在未记录的要求。

首先,要授权的 redirect_uri 参数和 access_token 必须匹配

显然 Facebook(或者更确切地说是 OAuth2)正在使用 redirect_uri 作为内部密钥来编码为 access_token 请求返回的代码。这有点聪明,因为它会验证您的网站。它解释了为什么不需要 redirect_uri 参数的 access_token 请求需要一个。

第二,你不能在redirect_uri中使用很多特殊字符

大量讨论是否可以传递参数。他们可以,您可以限制哪些字符是有效的,但没有人发布我知道的列表。像 url/html 编码这样的传统方法将失败,因为 percent(%) 无效。斜杠 (/) 也无效,因此嵌套的重定向 url 总是会失败。克服特殊字符限制的唯一方法是将参数值编码为 base64。如果您使用的是 ASP.NET,请查找 Convert.ToBase64。

最后,这更像是一个旁注。有很多程序员传递错误信息,一个简单的解决方案是传递 type=client_cred。这可能会限制您访问您在授权中请求的某些权限。这是不可取的。

【讨论】:

  • 不知道 redirect_uri 必须在两者上都匹配(尽管这很有意义)。这个问题一直在给出,甚至几个月后:)
  • 太棒了,迈克尔!我遇到了同样的问题,我的 auth 和 access_token 调用没有相同的 redirect_uri 参数。 --FFS--
  • 大多数 Base64 编码包含斜杠 (/)。确保使用 url 安全编码器
  • 这个回复为我节省了很多时间。谢谢!鉴于 FB 知道错误是什么,我想知道他们为什么不让消息更具描述性。
  • 尾随斜杠,或缺少斜杠。小心他们。
【解决方案5】:

我也遇到了同样的问题。

诚然,我是一个超级 n00b,如果这个解决方案在实际实践中没有任何意义,请原谅。

我只需使用我的 FB Connect 按钮在页面中设置一个带有测试变量的短熔断 cookie(1-2 分钟)。当 FB 向我的数据解析/处理脚本返回信息时,我检查了我正在重定向它的这个 cookie,如果找到,则使用 header:location 将用户定向到正确的 URL。

当然,某些浏览器/用户等会禁用 cookie。这显然不会在那里工作(也许使用会话变量并在 fb 数据处理程序中销毁它?)我确信有更好的方法来做到这一点,但目前,这个创可贴有效。

【讨论】:

    【解决方案6】:

    在使用redirect_uri=http://localhost:8000(编码为http%3A%2F%2Flocalhost%3A8000)进行测试时整天遇到同样的问题...

    解决方案只是确保将尾部斜杠 / 放在 uri 的末尾。所以redirect_uri=http://localhost:8000/(编码为http%3A%2F%2Flocalhost%3A8000%2F)。

    再次确保 redirect_uri 对于两个请求是相同的。

    【讨论】:

    • 2 小时...为此浪费了 2 小时...谢谢
    • 浪费了 3 个小时——完美!谢谢!
    • 浪费了 1 小时 - 谢谢!
    • 2 天 - 非常感谢!
    • 浪费了几个小时。添加斜线对我没有任何改变。
    【解决方案7】:

    我注意到您正在使用我也在使用的 Yii,并且半天都遇到了同样的问题。如前所述,问题在于您的 URL 中的特殊字符 i.e. r=site/oath2

    您可以通过在配置中启用漂亮的 URL 来修复它,以便您的 URL 变为 index.php/site/oath2

    不过,它似乎可以在没有尾部斜杠的情况下工作。

    【讨论】:

    • 在哪里可以在配置中启用漂亮的 URL?
    【解决方案8】:

    Aaron Wheeler 提供的部分信息不正确。

    确实,两个请求中的“redirect_uri”参数必须相同,但是完全可以对常规 URL 进行 URL 编码并将其用作“redirect_url”参数的值,只要您小心地进一步对任何内联 URL 进行 URL 编码。

    例如,您希望 facebook 重定向到以下 URL:

    http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants
    

    试图将用户重定向到

    'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
    . urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants');
    

    将失败,因为/Party/Pants 创建了一个无效的 URL

    但是,重定向到

    'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
    .urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
    .urlencode('/Party/pants'));
    

    会按预期工作。

    如果您在第二次验证应用程序请求时使用返回的 redrect_uri 值,请务必再次进行 url 编码 - 在填充 $_GET 超全局时,该值会自动进行 URL 解码。 - 这就是让我绊倒的原因。

    'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567'
    .urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
    .urlencode($_GET['my_param_1']));
    

    附:在您的实际代码中,我建议使用 sprintf() 而不是像我的示例中那样将字符串链接在一起,以获得更好的可读性。

    【讨论】:

      【解决方案9】:

      我的答案是这样的:

      $user = $facebook->getUser();     
      if (!$user) {
          $loginUrl = $facebook->getLoginUrl(array(
              'scope' => '',
              'redirect_uri' => $this->domain,
          ));
          print('<script> top.location.href=\'' . $loginUrl . '\'</script>');
      }
      

      在找到此解决方案之前,我已经绞尽脑汁很久了,看来我不是唯一一个遇到此问题的人,我希望这对您有用!

      【讨论】:

        【解决方案10】:

        我遇到过这个问题。我知道我的 URL 是相同的,因为我使用了具有相同 $var 的类,但我不断收到 400 响应和 JSON 响应中的错误。

        我唯一做的就是改变我的redirect_uri:

        http://myredirecturi.com
        

        http://myredirecturi.com/
        

        是的,刚刚添加了斜杠就可以了。

        【讨论】:

        • 有同样的问题,但在 Java 上。令人难以置信的是斜杠解决了它:(OOOF。谢谢。
        • 你是超级英雄。 ?‍♂️
        【解决方案11】:

        您实际上不需要编码,只需将“/”放在 redirect_url 的末尾就可以了!

        【讨论】:

        • 为我工作!谢谢!
        【解决方案12】:

        为此苦苦挣扎了一段时间。由于我不想要重定向,但需要重定向参数,我的解决方案是简单地将其设置为空 -

        ...&redirect_uri=&client_secret=...
        

        【讨论】:

          猜你喜欢
          • 2016-08-14
          • 1970-01-01
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-25
          • 2011-05-19
          相关资源
          最近更新 更多