2016-09-22 3 views
0

Ich benutze API Facebook auf meiner Website einloggen, aber .. Login vom Desktop-Browser funktioniert gut, melden Sie sich von mobilen Browser einen Fehler zurück.Facebook Login-Fehler in Handy-Browser

Die Fehlermeldung von mobilem Browser ist: Facebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing from persistent data.

In Login-Seite ich diesen Code verwendet, um den Link zu erzeugen auf facebook (Ich bin der Facebook-PHP SDK)

Login

if(!session_id()) { 
     session_start(); 
    } 
    $fb = new Facebook\Facebook([ 
     'app_id' => APP_ID, 
     'app_secret' => APP_SECRET, 
     'default_graph_version' => 'v2.2' 
    ]); 

    $helper = $fb->getRedirectLoginHelper(); 

    $permissions = ['email']; // Optional permissions 
    $loginUrl = $helper->getLoginUrl(SERVER_CALLBACK, $permissions); 

    $facebook = htmlspecialchars($loginUrl); 

Dies ist der Rückruf

Rückruf

if(!session_id()) { 
     session_start(); 
    } 
    $fb = new Facebook\Facebook([ 
     'app_id' => APP_ID, 
     'app_secret' => APP_SECRET, 
     'default_graph_version' => 'v2.2', 
     'persistent_data_handler'=>'session' 
    ]); 

    $helper = $fb->getRedirectLoginHelper(); 

    try { 
     $accessToken = $helper->getAccessToken(); 
    } catch(Facebook\Exceptions\FacebookResponseException $e) { 
     // When Graph returns an error 
     echo 'Graph returned an error: ' . $e->getMessage(); 
     exit; 
    } catch(Facebook\Exceptions\FacebookSDKException $e) { 
     // When validation fails or other local issues 
     echo 'Facebook SDK returned an error: ' . $e->getMessage(); 
     exit; 
    } 

    if (! isset($accessToken)) { 
     if ($helper->getError()) { 
      header('HTTP/1.0 401 Unauthorized'); 
      echo "Error: " . $helper->getError() . "\n"; 
      echo "Error Code: " . $helper->getErrorCode() . "\n"; 
      echo "Error Reason: " . $helper->getErrorReason() . "\n"; 
      echo "Error Description: " . $helper->getErrorDescription() . "\n"; 
     } else { 
      header('HTTP/1.0 400 Bad Request'); 
      echo 'Bad request'; 
     } 
     exit; 
    } 

    // Logged in 

    // The OAuth 2.0 client handler helps us manage access tokens 
    $oAuth2Client = $fb->getOAuth2Client(); 

    // Get the access token metadata from /debug_token 
    $tokenMetadata = $oAuth2Client->debugToken($accessToken); 

    // Validation (these will throw FacebookSDKException's when they fail) 
    $tokenMetadata->validateAppId(APP_ID); 
    // If you know the user ID this access token belongs to, you can validate it here 
    $tokenMetadata->validateExpiration(); 

    if (! $accessToken->isLongLived()) { 
     // Exchanges a short-lived access token for a long-lived one 
     try { 
      $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); 
     } catch (Facebook\Exceptions\FacebookSDKException $e) { 
      echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n"; 
      exit; 
     } 
    } 

Ich bin Wunder, weil alles in Desktop-Navigation funktioniert, aber mit einem mobilen Browser etwas nicht in Ordnung ist.

+0

Höchstwahrscheinlich ein Sitzungsproblem. Überprüfen Sie, ob der mobile Browser den Sitzungscookie akzeptiert hat und sendet dieselbe Sitzungs-ID mit den nächsten Anforderungen zurück. – CBroe

Antwort

1

Das Problem war während der Generierung der Sitzung.

Hier falschen Code:

if (ini_set('session.use_only_cookies', 1) === FALSE) exit(); 
// Forces sessions to only use cookies. 
ini_set('session.cookie_httponly', 1); 
// This stops JavaScript being able to access the session id. 
// Activate if you use a HTTPS connection 
ini_set('session.cookie_secure', 0); 
// Sets the session name to the one set above. 
session_name(NAME_SESSION); 
session_set_cookie_params(3600 * 12); 
session_start(); 
session_regenerate_id(TRUE); // <- This is the error 

Da die Funktion session_regenerate_id nicht instabil Netzwerk gut umgehen. z.B. Mobil- und WLAN-Netzwerk. Daher können Sie Sitzung verloren gehen, indem Sie session_regenerate_id aufrufen. Here the solution