FB.login with PHP API


FB.login with PHP API

我已经设置了一个画布页面,点击表单提交按钮时,它就是FB.login。在以下请求期间,它尝试通过$facebook->api('/me')(来自Github的最后一个API版本)访问用户数据。它适用于Firefox和Chrome,但不适用于Safari和IE,其中API失败并显示"需要身份验证令牌"。有没有人已经遇到过这个问题或知道可能导致它的原因?

BR 菲利普

编辑:

我在表单提交按钮的点击事件中调用FB.login:

$('.form-submit', this).click(function() {
  FB.getLoginStatus(function(response) {
    if (response.session) {
      form.submit();
    } else {
      FB.login(function(response) {
        if(response.session && (permissions == '' || response.perms)) {
          form.submit();
        }
        else {
        }
      },{perms:permissions});
    }
  });
  return false;
});

在服务器端,只需构造 php-api 对象并尝试获取用户数据:

$facebook = new Facebook(array(
  'appId' => $appid,
  'secret' => $appsecret,
  'cookie' => TRUE,
));
if ($facebook) {
  try {
    $me = $api->api('/me');
  }
  catch (Exception $exc) {
    // Failure in Safari and IE due to invalid auth token
  }
}

signed_request在隐藏的表单元素中传递。

我遇到了同样的问题,我在下面提供了一个解决方案。

我相信发生这种情况的原因是因为在 Javascript 登录尝试中,您的服务器永远不会收到任何访问令牌。Javascript 只在你的浏览器和 Facebook.com 之间传递数据,所以你的服务器不知道身份验证状态是什么。您的服务器只会在刷新页面时收到新的访问令牌;这是Facebook交出访问令牌的地方。

这是我的解决方案。通过FB.login成功登录后,您将收到响应对象,其中是一个access_token。您需要做的就是以某种方式将此访问令牌传递给脚本。下面是一个示例:

// Hold the access token
var js_access_token = "";
// Connect to facebook
FB.login(function(response) {
  if (response.session) {
    if (response.perms) {
      // user is logged in and granted some permissions.
      // Save the access token
      js_access_token = response.session.access_token;
      // Do stuff on login
    }
  }
});

然后,将访问令牌与任何请求一起包括在内。我选择了一个 ajax 示例。

// Communication back to server.
$.ajax({
  url: 'myurl.php',
  data: {
    js_access_token: js_access_token // Including the js_access_token
  },
  success: function(data) {
    console.log(data);
 }
});

在你的PHP中,你需要有这样的东西:

$facebook = new Facebook(array(
  'appId' => $appid,
  'secret' => $appsecret,
  'cookie' => TRUE,
));
if ($facebook) {
  // If we get the access token from javascript use it instead
  if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) {
    $facebook->setAccessToken($_REQUEST['js_access_token']);
  }
  try {
    $me = $api->api('/me');
  }
  catch (Exception $exc) {
    // Failure in Safari and IE due to invalid auth token
  }
}

希望这有帮助

我在使用JS FB登录时遇到了很多麻烦。我建议使用更简单的重定向登录使用oauth和php fb api的getLoginUrl函数。

所以基本上你从PHP做,你检查你是否有你的会话,如果没有,你使用getLoginUrl并重定向到该页面,你的使用将被重定向到你的应用程序/网站与有效的会话(如果他接受)。

这有帮助吗?我真的浪费了几个小时试图让FB JS登录在任何浏览器上工作,但我不能,从那时起,我已经切换到我所有应用程序中的简单重定向登录方法,并取得了圆满成功。

我喜欢

Conor的回答,因为我必须将我的访问令牌从客户端传递到服务器端,因为它在Safari中不起作用(我认为是cookie问题)。但这是一个老问题,所以有些事情必须改变。var 现在不同了,正如 oliland 指出的那样,我们不应该将访问令牌作为 GET 参数发送。

无论如何,这是我最终得到的,以防它对任何人有帮助

<a id="start-button" href="#">Start</a>
<form id="entry-form" action="nextpageurl" method="post">
    <input type="hidden" name="access_token" />
</form>
<script>
$(document).ready(function() {
    $('#start-button').click(function(e) {
        e.preventDefault();
        FB.login(function (response) {
            if (response.authResponse) {
                $('#entry-form input').val(response.authResponse.accessToken);
                $('#entry-form').submit();
            } else {
                alert('Permissions required');
            }
        }, {});
    });
});
</script>

然后在 PHP 中,与 Conor 的答案几乎相同,但从 $_POST var 中获取代币。