有些用户无法使用Facebook登录

时间:2015-08-17 09:09:17

标签: php facebook cakephp facebook-javascript-sdk facebook-php-sdk

我的网站有一个奇怪的问题。问题是我已经实现了一个似乎正常工作的Facebook登录。但是对于某些用户而言,它根本不起作用。它不会给出任何错误消息,只需重定向到点击Facebook登录按钮的同一页面。所以我的用户点击我页面上的登录按钮,没有弹出没有错误消息,只需返回登录页面。

只有一次我的客户收到以下错误消息:" Ex代码:100 Ex msg:此授权代码已被使用。"

我不知道是什么原因导致这个问题,因为对我来说这很奇怪,基本上它适用于某些人,而不适用于其他人......

我真的不知道我应该发布哪些其他信息,但如果有人要求提供更多信息我可以提供。我正在使用带有PHP SDK的Facebook JS SDK。

更新1: login.php中的相关部分:

<script>
  // This is called with the results from from FB.getLoginStatus().
  function statusChangeCallback(response) {
    if (response.status === 'connected') {    
      // Logged into your app and Facebook.
      testAPI();
    } else if (response.status === 'not_authorized') {
      // The person is logged into Facebook, but not your app.
      $('#fb-login-auth').show();
      $('#fb-login-not-auth').remove();
    } else {
      // The person is not logged into Facebook, so we're not sure if
      // they are logged into this app or not.
      // document.getElementById('status').innerHTML = 'Please log into Facebook.';
      $('#fb-login-not-auth').remove();
      $('#fb-login-auth').show();
    }
  }
  function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }
  window.fbAsyncInit = function() {
    FB.init({
      appId: <?php echo FB_APP_ID; ?>,
      cookie : true,// enable cookies to allow the server to access the session
      xfbml: true,// parse social plugins on this page
      version: 'v2.2' // use version 2.2
    });
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
    FB.Event.subscribe('auth.login', function(response) {
      //TODO replace absolute link withr elative one for FB
      window.location = '/projects/salty/main/users/fblogin';
    });
  };
  // Load the SDK asynchronously
  (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/hu_HU/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
  } (document, 'script', 'facebook-jssdk'));
  function testAPI() {
    console.log('Welcome!Fetching your information.... ');
    FB.api('/me', function(response) {
      console.log('Successful login for: ' + response.name);
      $('#fb-login-auth').remove();
      $('#fb-login-not-auth').show();
      $('.fb_iframe_widget').remove();
    });
  }
</script>
...
echo $this->Html->link('<i class="fa fa-facebook"></i>Login with FB',
                       array('action' => 'fblogin'),
                       array('id' => 'fb-login-not-auth',
                             'escape' => false));

fblogin.php:

<h1 class="center">Facebook login</h1>
  <div id="fb-root"></div>
  <script>
    $(document).ready(function(){
      $('._4z_f').click();
    });
  window.fbAsyncInit = function() {
  FB.init({
    appId: <?php echo FB_APP_ID; ?>,
    cookie : true,
    xfbml: true,
    version: 'v2.2'
  });

  FB.login(function (response) {
    if (response.status === "connected") {
      var uID = response.authResponse.userID;
      console.log(uID);
      FB.api('/me', function (response) {});
    } else if (response.status === "not_authorized") {
      //authCancelled. redirect
    }
  },
  {
    scope: 'user_location,user_likes'
  });
};//closes window.fbAsynInit
// Load the SDK asynchronously
(function(d){
  var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement('script'); js.id = id; js.async = true;
  js.src = "//connect.facebook.net/hu_HU/all.js";
  ref.parentNode.insertBefore(js, ref);
}(document));
</script> 
<h1 id="redirecting">Redirecting</h1>
<fb:login-button scope="public_profile,email" onlogin="checkLoginState();">
</fb:login-button>

fblogin的相关控制器操作:

  public function fblogin() {
    if ($this->Auth->loggedIn()) {
      return $this->redirect($this->Auth->redirectUrl());
    }
    \Facebook\FacebookSession::setDefaultApplication(FB_APP_ID, FB_APP_SECRET);
    $fbHelper = new \Facebook\FacebookJavaScriptLoginHelper();
    try {
      $session = $fbHelper->getSession();
    } catch(Facebook\FacebookRequestException $ex) {
      echo "Ex code: " . $ex->getCode();
      echo "Ex msg:  " . $ex->getMessage();
      return $this->redirect(array('action' => 'login'));
      // When Facebook returns an error
    } catch(\Exception $ex) {
      echo "Ex code: " . $ex->getCode();
      echo "Ex msg:  " . $ex->getMessage();
      return $this->redirect(array('action' => 'login'));
      // When validation fails or other local issues
    }
    if ($session) {
      $access_token = $session->getToken();
      $appsecret_proof = hash_hmac('sha256', $access_token, FB_APP_SECRET);
      $request = new \Facebook\FacebookRequest($session, 'GET', '/me?fields=id,name,first_name,middle_name,last_name,email', array("appsecret_proof" =>  $appsecret_proof));
      $response = $request->execute();
      $user = $response->getGraphObject(\Facebook\GraphUser::className());
      $checkPermissions = new \Facebook\FacebookRequest($session, 'GET', '/me/permissions', array("appsecret_proof" => $appsecret_proof));
      $checkResponse = $checkPermissions->execute();
      $permissionsObject = $checkResponse->getGraphObject(\Facebook\GraphUser::className());
      $permissions = json_decode(json_encode($permissionsObject->asArray()), true);
      $isEmailPermissionGiven = true; 
      foreach($permissions as $permission) {
        if ($permission['permission'] == 'email'
            && $permission['status'] == 'declined') {
          $isEmailPermissionGiven = false;
        }
      }
      $fbUser = array();
      $fbUser['User']['username'] = $user->getName();
      $fbUser['User']['last_name'] = $user->getFirstName()." ".$user->getMiddleName();
      ...
      $this->Auth->login($user['User']);
    }
  }

提前致谢, 佐尔坦

0 个答案:

没有答案