2012-05-31 10 views
7

Witam próbuję użyć uwierzytelniania na serwerze facebook, aby uzyskać token dostępu, ale ciągle dostaję błędy.Żetony dostępu do Facebooka - uwierzytelnianie po stronie serwera

Używam poniżej:

$app_id = "YOUR_APP_ID"; 
    $app_secret = "YOUR_APP_SECRET"; 
    $my_url = "YOUR_URL"; 

    session_start(); 
    $code = $_REQUEST["code"]; 

    if(empty($code)) { 
    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 
    $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
     . $_SESSION['state']; 

    echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
    } 

    if($_REQUEST['state'] == $_SESSION['state']) { 
    $token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 

    $response = file_get_contents($token_url); 
    $params = null; 
    parse_str($response, $params); 

    $graph_url = "https://graph.facebook.com/me?access_token=" 
     . $params['access_token']; 

    $user = json_decode(file_get_contents($graph_url)); 
    echo("Hello " . $user->name); 
    } 
    else { 
    echo("The state does not match. You may be a victim of CSRF."); 
    } 

ID App i APP Tajny zostały usunięte, więc nie martw się o tej części. Otrzymuję błędy dotyczące limitu czasu get_file_contents.

[function.file-get-contents]: failed to open stream: Connection timed out

Czy istnieje inny lub lepszy sposób na uzyskanie dostępu żetony?

Bellow jest wersja Próbowałem tym cURL pomysł:

function get_data_cURL($url) 
{ 
    $ch = curl_init(); 
    $timeout = 5; 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function getAccessToken(){ 
    $app_id = FB_APP_ID; 
    $app_secret = FB_SECRET_ID; 
    $canvas_URL = FB_CANVAS_URL; 

    session_start(); 
    $code = $_REQUEST["code"]; 

    if(empty($code)) { 
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($canvas_URL) . "&state=" 
     . $_SESSION['state']; 

     echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
    } 

    if($_REQUEST['state'] == $_SESSION['state']) { 
     $token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($canvas_URL) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 

    $returned_content = get_data_cURL($token_url); 
    echo'Well Done! - '.$returned_content; 

    } 
    else { 
     echo("The state does not match. You may be a victim of CSRF."); 
    } 
} 

szczegóły:

App Ustawienia - Canvas URL: http://www.apps.elistone.co.uk/DrawMyFriend/

FB_APP_ID = The Facebook App ID 
FB_SECRET_ID = The Facebook Secret ID 
FB_CANVAS_URL = http://www.apps.elistone.co.uk/DrawMyFriend/ 

Nawet z tej aktualizacji i nadal otrzymuję ten błąd:

Old ERROR

Well Done! - {"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}

New ERROR

Wydaje się to być spowodowane przez przekierowanie usuwając kod państwowy.

The state does not match. You may be a victim of CSRF. - 193c791ddd71c3fd84d411db5554c315 (state code)

Próbowałem również z pominięciem ochronę CSRF zmieniając:

if($_REQUEST['state'] == $_SESSION['state']) 

TO:

if(!empty($code)) 

Ale to wciąż daje stary problem błędu, słyszałem to jest spowodowane coś w łączu przekierowania, ale nie jestem pewien, jak to naprawić.

problem rozwiązany

Po wypróbowaniu wzdłuż czasu i doprowadziły do ​​korzystania z PHP SDK używając poniżej, aby uzyskać tokenu dostępu użytkownika:

$app_id = FB_APP_ID; 
$app_secret = FB_SECRET_ID; 
$canvas_URL = FB_PAGE_URL; 
$code = $_REQUEST["code"]; 

if(empty($code)) { 
    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 
    $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . $canvas_URL . "&state=" 
    . $_SESSION['state']; 

    echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
} 
if($_REQUEST['state'] == $_SESSION['state']) { 
$facebook->api('oauth/access_token', array(
    'client_id'  => FB_APP_ID, 
    'client_secret' => FB_SECRET_ID, 
    'type'   => 'client_cred', 
    'code'   => $code, 
)); 
$token = $facebook->getAccessToken(); 
echo$token; 
} 

mam teraz zamiar przekształcić niektóre funkcja sorta. Dziękuję bardzo za czas i pomoc.

Nadzieja to pomaga ludziom w potrzebie w przyszłości (chyba Facebook zmienia wszystko nagle)

+0

Każdy powód, dla którego nie chcesz używać pakietu Facebook PHP SDK? – phwd

+0

@phwd Powodem, dla którego nie używam pakietu PHP SDK jest to, że daje mi token dostępu do aplikacji, a nie token dostępu użytkownika, który jest tym, co muszę zrobić, co chcę. –

Odpowiedz

8

Polecam ci używanie PHP SDK library do komunikowania się z Facebook API. I po prostu użyj metod getAccessToken() lub getAccessTokenFromCode().

UPDATE

Aby pobrać token dostępu użytkownika trzeba wysłać prośbę OAuth przed uzyskaniem dostępu token. Szczegóły w odpowiedzi aktualizacji:

$facebook->api('oauth/access_token', array(
     'client_id'  => APP_ID, 
     'client_secret' => APP_SECRET, 
     'type'   => 'client_cred', 
     'code'   => $code, 
    )); 
    $token = $facebook->getAccessToken(); 
+0

getAccessToken() obecnie daje mi tylko token dostępu do aplikacji, który nie jest wystarczająco dobry dla tego, czego potrzebuję. Chcę wymagać tokenu dostępu użytkownika. Jak to zrobić, żeby to zrobić? –

+0

Metoda 'getUserAccessToken()' dla tego – Oleg

+0

wydaje się być tak blisko, ale ten błąd: 'Błąd krytyczny: wywołanie metody chronionej BaseFacebook :: getUserAccessToken()' –

2

dwóch najbardziej prawdopodobnych przyczyn awarii na tym etapie to:

  • redirect_uri brakuje kończące „/”
  • redirect_uri w wywołaniu /oauth/access_token nie dokładnie odpowiadać redirect_uri podany do OAuth dialogowym

W obu przypadkach weryfikacja kodu zakończy się niepowodzeniem i nie dostaniesz tokena,

Błąd "błąd przerwania połączenia: przekroczenie czasu połączenia" prawdopodobnie nie jest z tym związany, zwykle wskazuje na Błąd DNS lub sieciowy podczas próby dotarcia do strony graph.facebook.com z Twojego serwera

+0

the redirect_uri = http://www.apps.elistone.co.uk/DrawMyFriend/, więc ma on końcowe ukośniki. Z tego, co widzę, uri jest dokładnie takie samo ... Więc czego brakuje. –

Powiązane problemy