Jak zweryfikować token dostępu do Facebooka?


108

Jest tylko jedna rzecz, którą musi zrobić serwer; po prostu sprawdź ważność dowolnego tokena dostępu.

Klienci wysyłają do serwera identyfikator użytkownika i token dostępu uzyskany przez FB.getLoginStatus. Jak się spodziewałem, byłby dowolny adres URL, który sprawdza ważność tokena dostępu, np http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

To zwraca, czy jest dostępny, czy nie, czy też istnieje do tego jakiś interfejs API (po stronie serwera)?


2
Dlaczego nie zadzwonić po prostu na graph.facebook.com/me/permissions?
— Igy



3
Jest fajny programistów
— .facebook.com

Odpowiedzi:


136

Oficjalnie obsługiwana metoda to:

GET graph.facebook.com/debug_token?
     input_token={token-to-inspect}
     &access_token={app-token-or-admin-token}

Więcej informacji można znaleźć w dokumentacji tokena czekowego .

Przykładowa odpowiedź to:

{
    "data": {
        "app_id": 138483919580948, 
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 1207059
    }
}

24
Myślę, że mylące jest twierdzenie, że Facebook z większym prawdopodobieństwem wprowadzi przełomowe zmiany. Nie twierdzą, że nigdzie, a ich oficjalne dokumenty jasno pokazują, że jest to sposób na walidację tokena dostępu
— Ed Sykes,

1
@rynop, cóż, nazwa punktu końcowego API to „debug_token” i jest ona opisana w sekcji dokumentacji interfejsu API Facebooka zatytułowanej Pobieranie informacji o tokenach i debugowaniu . Ta sekcja dokumentacji jest wskazywana przez kotwicę HTML #debug i stwierdza, że ​​interfejs API jest zapleczem ich narzędzia do debugowania. Wydaje mi się to całkiem jasne, ale masz rację, że technicznie nigdzie nie jest jasno i bezpośrednio stwierdzone, że funkcja nie jest przeznaczona do użytku produkcyjnego ... :-)
— Jonathan Gilbert

5
Główny problem polega na tym, że użycie metody me? Access_token jest po prostu błędne, jeśli dane pochodzą ze strony klienta; ponieważ każda witryna może wyłowić tokeny, a następnie użyj ich do uwierzytelnienia w witrynie, uzyskując dostęp do interfejsu API.
— srcspider

4
OP chciał sprawdzić identyfikator użytkownika powiązany z tokenem. Punkt końcowy / me zwraca identyfikator użytkownika, ale tylko wtedy, gdy token dostępu jest ważny (ponieważ w końcu token jest używany do określenia, które „ja” ma zwrócić). Więc weź / mnie i porównaj identyfikatory użytkowników. Należy pamiętać, że każda aplikacja otrzymuje własne identyfikatory użytkownika o specjalnym zakresie, więc nie można porównywać identyfikatorów z innego źródła z / me, które otrzymujesz z tokenem własnej aplikacji.
— Jonathan Gilbert

3
Dokumenty mogły w przeszłości odwoływać się do tego przy debugowaniu. Ale obecnie sugeruje, że jest to dokładnie przypadek użycia.
— AndHeiberg

78

Możesz po prostu zażądać https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx, jeśli pojawi się błąd, token jest nieprawidłowy. Jeśli otrzymasz obiekt JSON z właściwością id, to jest on prawidłowy.

Niestety, to tylko powie Ci, czy Twój token jest ważny, a nie jeśli pochodzi z Twojej aplikacji.


9
Przepraszam, moje pytanie nie było jasne. Problem polega na tym, jak zweryfikować użytkownika tylko za pomocą uid i accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Na przykład, czy istnieje prosty sposób sprawdzenia, czy token dostępu użytkownika 100000726976284 to xxxxxx. Wydaje mi się, że kluczem jest pole „zweryfikowane”. Dopiero po wpisaniu prawidłowego xxxxxx zobaczyłem w odpowiedzi zweryfikowany = true.
— Więc Jae Kyung

14
Poproś o graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx, jak wspomniano powyżej, a następnie sprawdź, czy posiadany identyfikator uid jest zgodny z identyfikatorem przekazanym zwrotnie z żądania.
— AlexQueue

51
Nie spowoduje to sprawdzenia, czy access_token jest przeznaczony dla Twojej aplikacji.
— Ed Sykes

Nie podaje też expires_atinformacji.
— Vinesh

4
głosowanie w dół, zgadzam się z @EdSykes, w ten sposób nie możesz sprawdzić, czy token dostępu należy do twoich programistów
— nikis

36

Chciałem tylko poinformować, że do dziś najpierw uzyskiwałem token dostępu do aplikacji (poprzez żądanie GET do Facebooka), a następnie korzystałem z otrzymanego tokena jako app-token-or-admin-token:

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app-token-or-admin-token}

Jednak właśnie zdałem sobie sprawę z lepszego sposobu na zrobienie tego (z dodatkową korzyścią polegającą na wymaganiu o jedno żądanie GET mniej):

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

Jak opisano w dokumentacji Facebooka dotyczącej tokenów dostępu tutaj .


6
Dziękuję Ci. Uwaga dla innych: dosłowne „|” znak musi zostać uwzględniony (nie wskazuje „lub”), jak pokazano na stronie, do której link znajduje się w odpowiedzi: developers.facebook.com/docs/facebook-login/…
— Mike S

1
Czy to nie jest niebezpieczne? Wysłanie tajemnicy aplikacji za pomocą parametrów zapytania URL ujawnia ją każdemu „w środku” między Twoim serwerem a Facebookiem i HTTPS, ponieważ adresy URL nie są szyfrowane. Każdy mógł po prostu „nasłuchiwać” (sniff) żądań z adresami URL w formacie debug_token i kraść sekrety aplikacji Facebooka.
— Simeon,


@Xeing dzięki, widzę, że miałem złe wrażenie :) Wygląda na to, że część adresu URL hosta nie jest zaszyfrowana.
— Symeon

1
Dodanie znaku „|” dzięki tajemnicy aplikacji wreszcie się udało. W przeciwnym razie ten interfejs API nie działa.
— Uday

4

Po prostu zażądaj (HTTP GET):

https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx

Otóż ​​to.



1

Exchange Access Tokendla Mobile Number and Country Code(po stronie serwera LUB po stronie klienta)

Możesz pobrać go mobile numberze swoim za access_tokenpomocą tego API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Być może, gdy już będziesz mieć mobile numberi id, będziesz mógł z nim pracować, aby zweryfikować użytkownika z rozszerzeniem server & database.

xxxxxxxxxx powyżej jest Access Token

Przykładowa odpowiedź:

{
   "id": "61940819992708",
   "phone": {
      "number": "+91XX82923912",
      "country_prefix": "91",
      "national_number": "XX82923912"
   }
}


Exchange Auth Codedla Access Token(po stronie serwera)

Jeśli masz Auth Codezamiast tego, możesz najpierw pobrać za Access Tokenpomocą tego API- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyyI zzzzzzzzzzpowyżej są Auth Code, App IDi App Secretodpowiednio.

Przykładowa odpowiedź

{
   "id": "619XX819992708",
   "access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
   "token_refresh_interval_sec": XX92000
}

Uwaga - Jest to korzystne na server-sideponieważ APIwymaga APP Secretktóry nie ma być sharedza security reasons.

Powodzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.