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)?

Więc Jae Kyung
źródło
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
    }
}
rynop
źródło
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.

Andy Muth
źródło
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 .

Andy
źródło
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,
1
@Simeon stackoverflow.com/questions/499591/are-https-urls-encrypted To jest dość bezpieczne.
Xeing
@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.

Nadav B
źródło
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.

Akash
źródło