Walidacja tokenów dostępu Facebooka po stronie serwera dla aplikacji na iPhone'a

112

Zajmuję się tworzeniem aplikacji na iPhone'a, która opiera się na komunikacji z serwerem i chcę korzystać z mechanizmów uwierzytelniania Facebooka.

Zasadniczo myślę, że powinno to działać tak:

  1. W mojej aplikacji na iPhone'a użytkownik loguje się do Facebooka, używając swojego adresu e-mail i hasła.
  2. Użytkownik zezwala na dostęp do swoich danych dla powiązanej aplikacji Facebook.
  3. Moja aplikacja na iPhone'a otrzymuje token dostępu po pomyślnym zalogowaniu.
  4. W dalszej komunikacji z moim serwerem aplikacja na iPhone'a powinna korzystać z otrzymanego tokena dostępowego Facebooka (np. W zapytaniach).
  5. Kiedy mój serwer otrzyma zapytanie z aplikacji na iPhone'a, z tokenem dostępu, powinien zapytać Facebooka, czy ten token jest ważny (i dla kogo), a jeśli tak, serwer powinien założyć, że użytkownik jest uwierzytelniony na Facebooku.

Moje pytanie brzmi: jak serwer powinien zapytać Facebooka, czy podany token dostępu jest ważny? Myślę, że powinienem jakoś sprawdzić, czy token jest ważny dla mojej aplikacji na Facebooku.

Wypróbowałem wiele zapytań z Facebooka do wykresu API, które znalazłem, ale nic nie działało tak, jak się spodziewałem. Czy możesz podać mi jakiś przykład?

Marcin
źródło
5
O ile użytkownik nie wylogował się z aplikacji na FB, możesz po prostu wysłać token autoryzacji na serwer (miejmy nadzieję, że ssl). Czy proste zapytanie „/ me” za pośrednictwem interfejsu graficznego API kończy się sukcesem czy niepowodzeniem?
The Mad Gamer
otrzymasz wiadomość w odpowiedzi z facebooka, że ​​twój token jest nieważny :)
Jean-Luc Godard
1
Próbuję zrobić coś bardzo podobnego do tego, co robisz. Nigdy nie oznaczyłeś tego pytania jako udzielonego, czy kiedykolwiek to zadziałało?
skwarny
Co się dzieje, gdy access_token wygaśnie? czy powinniśmy poprosić użytkownika o ponowne zalogowanie? chcę zrozumieć, jak ponownie zweryfikować poprawność po wygaśnięciu tokena
debianmaster
@debianmaster to zależy od architektury Twojej aplikacji. Jeśli weźmiesz pod uwagę przypadek „brak tokena FB - brak dostępu do aplikacji”, to tak, wyloguj użytkownika. W przeciwnym razie możesz rozważyć logikę "unlink", w której użytkownik pozostaje zalogowany, ale informacje otrzymane z Facebooka są odłączane od jego konta na serwerze / kliencie.
Yevhen Dubinin

Odpowiedzi:

115

Oto dwuetapowy proces, którego możesz użyć do sprawdzenia, czy token dostępu użytkownika należy do Twojej aplikacji:

1) Wygeneruj token dostępu do aplikacji

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) Debuguj token dostępu użytkownika

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

Gdzie INPUT_TOKEN to token dostępu użytkownika, który chcesz zweryfikować, a ACCESS_TOKEN to token Twojej aplikacji uzyskany w kroku 1.

Punkt końcowy debugowania zasadniczo zrzuca wszystkie informacje o tokenie, więc odpowie w następujący sposób:

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

Jeśli ten token nie pochodzi z „Twojej aplikacji”, zwróci odpowiedź o błędzie.

sebastian the crab
źródło
13
Według Facebooka jest to właściwy sposób sprawdzania tokenów. Jednak pierwsza część jest opcjonalna, ponieważ możesz użyć identyfikatora i klucza tajnego aplikacji zamiast tokenu administratora lub aplikacji.
Brandon Zacharie
@BrandonZacharie Nie widzę, jak to robisz, po prostu próbowałem z identyfikatorem aplikacji i sekretem i podałem błąd dotyczący „parametru input_token wymagany”
Johnny Z
@JohnnyZ token wejściowy jest wymagany. Token dostępu zapewnia elastyczność.
Brandon Zacharie
8
@BrandonZacharie Masz rację, tokeny wejścia i dostępu były pomieszane. Aby użyć identyfikatora aplikacji i klucza tajnego, przekazałem to jako parametr z potokiem jako separatorem: & access_token = APP_ID | APP_SECRET
Johnny Z
2
Powyższy link to teraz developers.facebook.com/docs/facebook-login/access-tokens/ ...
Chris Prince,
115

Aktualizacja: ta odpowiedź wydaje się niepewna, ponieważ nie weryfikuje najpierw tokena jako należącego do Twojej aplikacji, zobacz komentarze, oryginalna odpowiedź w następujący sposób:

Zakładam, że masz już w ręku token dostępu. W takim przypadku najprostszym sposobem sprawdzenia poprawności tokena dostępu jest wysłanie następującego żądania

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

Tutaj zamień @accesstoken na posiadany token dostępu. Zburzę adres URL i wyjaśnię każdy.

Wydajemy tutaj żądanie Graph API, które zwróci identyfikator użytkownika Facebooka właściciela tokena dostępu w postaci ciągu JSON. Słowo kluczowe „ja” reprezentuje aktualnie zalogowanego użytkownika lub właściciela tokena dostępu. W przypadku tego żądania token dostępu jest parametrem obowiązkowym.

Jeśli podany token dostępu jest nieprawidłowy lub wygasł, Facebook po prostu zwróci jakiś komunikat o błędzie.

W przypadku prawidłowego tokena dostępu wynik będzie wyglądał tak

{
   "id": "ID_VALUE"
}
Rudzik
źródło
14
Czy to żądanie nie powiedzie się, jeśli ten użytkownik dostarczy access_token, który należy do innej aplikacji?
Jurij Niemcow
2
Można użyć dowolnego ważnego tokena dostępu użytkownika (bez względu na to, do której aplikacji należy)
Robin
12
@Xiquid ten post nie jest rozwiązaniem problemu, ponieważ nie sprawdza, czy token dostępu należy do Twojej aplikacji.
Kolyunya
12
Nie rozumiem, dlaczego ta odpowiedź ma najwięcej głosów! To oczywiście nie jest właściwe rozwiązanie. Właściwie właściwym podejściem jest to, co zasugerował „krab sebastian”. Punkt końcowy debug_token służy do odpytywania informacji o samym tokenie, dzięki czemu można sprawdzić, czy token należy do określonego identyfikatora użytkownika dla określonego identyfikatora aplikacji!
Alex Ntousias
4
Tak, ta odpowiedź jest nieprawidłowa. Jeśli zweryfikujesz token dostępu w ten sposób, ktoś może uzyskać token dostępu z innej aplikacji i użyć go do uwierzytelnienia się w Twojej.
Jonathan
11

Innym rozwiązaniem byłoby użycie w https://graph.facebook.com/app/?access_token=[user_access_token]sposób opisany w sekcji Pobierz identyfikator aplikacji z tokenu dostępu użytkownika (lub zweryfikuj aplikację źródłową dla tokena) .

Wygląda na to, że jest to nieudokumentowana funkcja, ale zwraca kod JSON zawierający identyfikator aplikacji, dla której wygenerowano token. Jeśli token nie był przeznaczony dla Twojej aplikacji, zwraca 400.

Helen Williamson
źródło
Jak mogę uzyskać oceny innych firm na Facebooku. Co muszę w tym celu zrobić?
Maneesh Rao
6

W najnowszej wersji facebooka (2.2) możesz to zrobić w następujący sposób:

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

Przykładowe dane wyjściowe:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}
Shoeb Ahmed Mogal
źródło
Czy to oznacza, że ​​będziesz musiał wywoływać ten punkt końcowy fb przy każdym żądaniu? Czy nie ma lepszego sposobu?
Jdruwe
To działa, ale wymaga tokena dostępu. Token dostępu można wygenerować za pomocą odpowiedzi „sebastian the crab” lub po prostu użyć appid | appsecret. Więcej informacji developers.facebook.com/docs/facebook-login/ ...
krishnan
Oto przykład użycia tego: stackoverflow.com/a/16947027/32453
rogerdpack
2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

Możesz pobrać Facebook SDK dla PHP z GitHub .

Baptiste Costa
źródło
1

Jeśli użytkownik przekazał Ci identyfikator UID Facebooka, który twierdzi, że należy do niego i chcesz sprawdzić, czy jest on legalny, jest to funkcja Pythona, która zweryfikuje go z tokenem dostępu (implementacja odpowiedzi Robin Jome):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id
Andrew Magee
źródło
To nie potwierdza, że ​​token został wygenerowany „dla Twojej aplikacji” niestety ...
rogerdpack Kwietnia
1

To jedyna bezpieczna metoda weryfikacji tokena użytkownika przy użyciu tylko jednego żądania:

https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}

Zwróć uwagę, że znak „|” w powyższym adresie URL nie jest używany jako OR, ale jako separator i musi znajdować się po wypełnieniu pozostałych pól.

Odpowiedzią będzie JSON wyglądający tak:

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

Źródła: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (powyższa metoda jest wymieniona na dole tej sekcji)

Kamoris
źródło
Jest inny bezpieczny sposób z jednym żądaniem: stackoverflow.com/a/36555287/32453
rogerdpack
-1

Wraz z tokenem dostępu Facebook wysyła również parametr „expires_in”, który jest wartością przesunięcia. Użyj tego, aby obliczyć, kiedy token dostępu wygaśnie jako NSDate. Następnie, gdy musisz złożyć wniosek, porównaj bieżącą datę z datą wygaśnięcia.

Spróbuj także sprawdzić kody statusu i ciągi odpowiedzi, które Facebook odsyła.

jcm
źródło