Facebook SDK PHP 5.0 getLoginUrl() Error 500

2019-05-11 07:40发布

问题:

I am trying to use the examples provided under Facebook PHP SDK 5.0 to login to Facebook. I am getting back 500 Internal Server Error. I am using the Baby Plan from HostGator which is running Php 5.5.27 PHP INFO . Is there configuration I would need to add to my server to get things working?

login.php

<?php
session_start();
// Include the required dependencies.
require_once( 'vendor/autoload.php' );
// Initialize the Facebook PHP SDK v5.
$fb = new Facebook\Facebook([
  'app_id'                => '495994870548274',
  'app_secret'            => '593f18b375c9e23d34b9794136cf7158',
  'default_graph_version' => 'v2.3',
]);

$helper = $fb->getRedirectLoginHelper();

$permissions = ['email']; // Optional permissions
$loginUrl = $helper->getLoginUrl('http://techcomsgb.com/kidneytest/login-callback.php', $permissions);

echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>'

login-callback.php

<?php
session_start();

// Include the required dependencies.
require_once( 'vendor/autoload.php' );



// Initialize the Facebook PHP SDK v5.
$fb = new Facebook\Facebook([
  'app_id'                => '495994870548274',
  'app_secret'            => '593f18b375c9e23d34b9794136cf7158',
  'default_graph_version' => 'v2.3',
]);

$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
echo '<h3>Access Token</h3>';
var_dump($accessToken->getValue());

// 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);
echo '<h3>Metadata</h3>';
var_dump($tokenMetadata);

// Validation (these will throw FacebookSDKException's when they fail)
$tokenMetadata->validateAppId($config['app_id']);
// If you know the user ID this access token belongs to, you can validate it     here
//$tokenMetadata->validateUserId('123');
$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;
  }

  echo '<h3>Long-lived</h3>';
  var_dump($accessToken->getValue());
}

$_SESSION['fb_access_token'] = (string) $accessToken;

// User is logged in with a long-lived access token.

// You can redirect them to a members-only page. //header('Location: https://example.com/members.php');

回答1:

I had this error too. Most of the things was in the hosting side. I fixed by doing some things.

  1. Check the hosting PHP version 5.4 or higher
  2. Check mbstring enabled
  3. Set mbstring values in the php.ini

MBString Values Sample Image

See more: https://benmarshall.me/facebook-php-sdk/#requirements

Then, in the callback.php Facebook Exceptions wasn't working so I change it to the PHP Exception Method like this:

try {
    $accessToken = $helper->getAccessToken();  
} catch(Exception $e) {
    // There was an error communicating with Graph  
    echo $e->getMessage();       
    exit;  
}

Then I get the error message. It was the date.timezone, I added in the php.ini file and now everything is working.

[date] date.timezone = "America/Los_Angeles"


回答2:

Simple error, incorrect file permissions on login-callback.php



回答3:

It's because you forgot to place an app-id in this section:

    // Validation (these will throw FacebookSDKException's when they fail)
    $tokenMetadata->validateAppId({app-id}); // Replace {app-id} with 
    // your app id
    // If you know the user ID this access token belongs to, you can validate 
    // it here
    //$tokenMetadata->validateUserId('123');
    $tokenMetadata->validateExpiration();

Replace the {app-id} with your ID and then it should work. I'm surprised no one on Facebook pointed this out.



回答4:

For me it was the link returned by $helper->getLoginUrl(), so I just replaced https://www.facebook.com/v2.8/dialog/oauth with https://graph.facebook.com/oauth/authorize.

 $login_url = $login_helper->getLoginUrl('www.yoururl.com/fb-callback.php'), $permissions);
 $login_url = str_replace('https://www.facebook.com/v2.8/dialog/oauth?', 'https://graph.facebook.com/oauth/authorize?', $login_url);

Look at this post for reference Facebook oauth authorize URL and parameter options

"when you want to build the login flow manually you should use /oauth/authorize.. else if you are using javascript/Apps api provided by facbook it uses /dialog/oauth"