Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP API登录FB.login_Php_Facebook - Fatal编程技术网

使用PHP API登录FB.login

使用PHP API登录FB.login,php,facebook,Php,Facebook,我已经建立了一个画布页面,点击表单提交按钮,doe就是FB.login。在以下请求期间,它尝试通过$facebook->api('/me')(Github的最后一个api版本)访问用户数据。它可以在Firefox和Chrome中使用,但不能在Safari和IE中使用,在IE中,API会因“需要身份验证令牌”而失败。有没有人已经有过这个问题,或者知道是什么导致了这个问题 菲利普 编辑: 我在表单提交按钮的单击事件中调用FB.login: $('.form-submit', this).click(

我已经建立了一个画布页面,点击表单提交按钮,doe就是FB.login。在以下请求期间,它尝试通过$facebook->api('/me')(Github的最后一个api版本)访问用户数据。它可以在Firefox和Chrome中使用,但不能在Safari和IE中使用,在IE中,API会因“需要身份验证令牌”而失败。有没有人已经有过这个问题,或者知道是什么导致了这个问题

菲利普

编辑:

我在表单提交按钮的单击事件中调用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
  }
}

签名的请求在一个隐藏的表单元素中传递。

我在JS FB登录方面遇到了很多问题。我建议使用oauth和php fb api中的
getLoginUrl
函数使用更简单的重定向登录

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


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

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

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

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

// 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
  }
}

希望这有帮助

我喜欢Conor的回答,因为我必须将我的访问令牌从客户端传递到服务器端,因为它在Safari中不起作用(我想是cookie问题)。但这是一个老问题,所以有些事情必须改变。vars现在不同了,正如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>

$(文档).ready(函数(){
$(“#开始按钮”)。单击(函数(e){
e、 预防默认值();
FB.登录(功能(响应){
if(response.authResponse){
$('#输入表单输入').val(response.authResponse.accessToken);
$(“#输入表格”).submit();
}否则{
警报(“需要权限”);
}
}, {});
});
});

然后在PHP中,与Conor的答案基本相同,但是从$u POST var获取令牌。

My Deary,您应该提供您的所有代码。问题可能出在你的头上。这不是一个常见的问题。您能提供一些代码吗?我猜这与你的会话/cookies或一些js弹出窗口没有出现有关。。您的safari控制台中有任何错误吗?刚刚在上面添加了我的代码。有一些“不安全的请求”-警告,但它们总是出现在facebook上。这就是确切的例外->消息:必须使用活动访问令牌来查询有关当前用户的信息。非常感谢!它不像弹出式登录那样“漂亮”,但至少它在任何地方都能工作。完全同意这一点。我后悔使用了Facebook Javascript SDK。我花了很多时间研究被一些浏览器屏蔽的Facebook窗口弹出窗口。最后,我决定使用重定向一个解决方案。这是错误的!我们不应该在客户端和服务器之间发送未加密的访问令牌。在这里了解新的身份验证方法:@oliland谢谢+链接为1