2011-01-05 19 views
10

Buduję aplikację internetową (PHP), która korzysta z połączenia FB. Pomyślnie zarejestrować/zalogować użytkownika przy pomocy biblioteki PHP dostarczonej przez Facebook. Również mogę pisać do ściany, przy użyciu tego koduCzy mogę przechowywać token dostępu Facebook i używać go później?

 Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false; 
    Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2;    
    $facebook = new Facebook(array(
     'appId' => $fb_key, 
     'secret' => $fb_secret, 
     'cookie' => true, // enable optional cookie support 
    )); 
    $session = $facebook->getSession(); 
    if ($session) 
    { 
     $facebook->api('/me/feed', 'POST', array('message'=>$message, 'link'=>$link['href'], 'name'=>$link['text']));     
    } 

Jednak gdybym ręcznie przejść do menadżera ciasteczek przeglądarce i usunąć plik cookie, który przechowuje sesję FB, kod nie działa. Jedyne, co mam, to identyfikator FB użytkownika, który przechowuję w DB. Czy istnieje sposób na opublikowanie wiadomości na ścianie użytkownika, nawet jeśli sesje FB zostaną utracone? Czy ma sens przechowywanie tokenu dostępu użytkownika FB w bazie danych DB, aby opublikować go później lub czy token dostępu jest stosunkowo krótkotrwały?

Oto przykładowa sytuacja, która może się zdarzyć w mojej aplikacji: użytkownik klika przycisk FB, autoryzuje moją aplikację, zostaje przekierowany z powrotem do mojej witryny, gdzie automatycznie utworzę konto na podstawie danych dostarczonych przez FB, również przechowuję FB ID użytkownika aby móc później zalogować się do tego użytkownika. Teraz przegląda witrynę, wprowadza pewne informacje i ta informacja zostaje wysłana do jego ściany. Na razie wszystko jest w porządku, ponieważ przeglądarka użytkownika przechowuje plik cookie utworzony przez FB. Teraz użytkownik opuszcza administratora witryny i kontaktów. Administrator otwiera własną przeglądarkę, przechodzi do interfejsu administratora i publikuje coś w imieniu tego użytkownika. Teraz, mając identyfikator FB tego użytkownika i zakładając, że użytkownik nie odwołał uprawnień, czy mogę nadal umieszczać go na ścianie?

Odpowiedz

8

UPDATE: Ta odpowiedź nie jest już ważna, ponieważ offline_access jest przestarzała.

Musisz zażądać uprawnienia offline_access. Sprawdź dokument permissions.

EDYTOWANIE Dla aktualizacji i komentarzy - niektóre informacje na temat usuwania offline_access można znaleźć here.

+0

Dzięki, działa świetnie! – Eugene

+4

To będzie przestarzałe. Spróbuj użyć 60-dniowego klucza dostępu. – funerr

23

Z Facebook PHP SDK v3 (see on github), jest bardzo proste, aby zapytać i używać tokenu dostępu offline użytkownika. Oto jak to zrobić.

Uzyskać dostęp offline tokena

Najpierw trzeba sprawdzić, czy użytkownik jest zalogowany czy nie:

require "facebook.php"; 
$facebook = new Facebook(array(
    'appId' => YOUR_APP_ID, 
    'secret' => YOUR_APP_SECRET, 
)); 

$user = $facebook->getUser(); 

if ($user) { 
    try { 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    $user = null; 
    } 
} 

Jeśli nie jest, należy wygenerować „Zaloguj się z Facebook” URL z prośbą o offline_access pozwolenie:

if (!$user) { 
    $args['scope'] = 'offline_access'; 
    $loginUrl = $facebook->getLoginUrl($args); 
} 

, a następnie wyświetlić link w szablonie:

<?php if (!$user): ?> 
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a> 
<?php endif ?> 

Następnie, gdy użytkownik jest zalogowany, można pobrać token dostępu offline i go zapisać. Aby uzyskać go, zadzwoń:

if ($user) { 
    $token = $facebook->getAccessToken(); 
    // store token 
} 

Użyj dostęp offline tokena

Aby korzystać z dostępu offline żeton, gdy użytkownik nie jest zalogowany:

require "facebook.php"; 
$facebook = new Facebook(array(
    'appId' => YOUR_APP_ID, 
    'secret' => YOUR_APP_SECRET, 
)); 

$facebook->setAccessToken("..."); 

I teraz można wykonywać połączenia API dla tego użytkownika:

$user_profile = $facebook->api('/me'); 

Mam nadzieję, że pomaga!

+2

Znakomita odpowiedź. Powinieneś napisać dokumentację na Facebooku, ponieważ jest to lepsze niż to, co już tam jest. –

+0

Dzięki Michałowi :) – Quentin

+0

Bardzo Bardzo Świetne Rozwiązanie, którego szukałem przez 3 dni. –

Powiązane problemy