Bagaimana cara memverifikasi token akses Facebook?

108

Hanya ada hal yang harus dilakukan server; cukup periksa validitas token akses apa pun.

Klien mengirim ke id pengguna server dan token akses yang diperoleh FB.getLoginStatus. Seperti yang saya harapkan, akan ada URL yang memeriksa validitas token akses, seperti http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Itu mengembalikan apakah itu tersedia atau tidak atau apakah ada API (sisi server) untuk itu?

Jadi Jae Kyung
sumber
2
Mengapa tidak menelepon graph.facebook.com/me/permissions?
Igy
3
Ada pengembang
Pendeta

Jawaban:

136

Metode yang didukung secara resmi untuk ini adalah:

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

Lihat dokumen cek token untuk informasi lebih lanjut.

Contoh tanggapannya adalah:

{
    "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
sumber
24
Saya pikir itu menyesatkan untuk mengatakan bahwa facebook lebih cenderung memperkenalkan perubahan yang melanggar. Mereka tidak menyatakan bahwa di mana pun dan dokumen resmi mereka menjelaskan bahwa ini adalah cara untuk memvalidasi token akses
Ed Sykes
1
@rynop, nah, nama titik akhir API adalah "debug_token", dan dijelaskan di bagian dokumentasi API Facebook yang berlabel Mendapatkan Info tentang Token dan Debugging . Bagian dokumentasi ini dirujuk oleh HTML anchor #debug, dan menyatakan bahwa API adalah back-end untuk alat debugnya. Tampaknya cukup jelas bagi saya, tetapi Anda benar bahwa secara teknis, tidak ada yang secara jelas dan langsung menyatakan bahwa fungsi tersebut tidak dimaksudkan untuk penggunaan produksi ... :-)
Jonathan Gilbert
5
Masalah utama di sini adalah bahwa menggunakan metode me? Access_token benar-benar salah jika data berasal dari sisi klien; karena situs mana pun dapat memancing token lalu menggunakannya untuk mengautentikasi ke situs Anda dengan mengakses api Anda.
srcspider
4
OP ingin memeriksa ID pengguna yang terkait dengan token tersebut. The / me endpoint mengembalikan ID pengguna, tetapi hanya jika token akses berlaku (karena, setelah semua, token digunakan untuk menentukan yang "saya" untuk kembali). Jadi, ambil / saya dan bandingkan ID pengguna. Perlu diingat bahwa setiap aplikasi mendapatkan ID pengguna yang memiliki cakupan khusus, jadi Anda tidak dapat membandingkan ID dari sumber yang berbeda dengan / saya yang Anda dapatkan dengan token aplikasi Anda sendiri.
Jonathan Gilbert
3
Dokumen mungkin di masa lalu telah mereferensikan penggunaan ini untuk debugging. Tetapi saat ini disarankan bahwa ini persis kasus penggunaan.
AndHeiberg
78

Anda cukup meminta https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx jika Anda mendapatkan kesalahan, token tidak valid. Jika Anda mendapatkan objek JSON dengan properti id, maka itu valid.

Sayangnya ini hanya akan memberi tahu Anda jika token Anda valid, bukan jika itu berasal dari aplikasi Anda.

Andy Muth
sumber
9
Maaf, pertanyaan saya tidak jelas. Masalahnya adalah bagaimana memverifikasi pengguna hanya dengan uid dan accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Misalnya, apakah ada cara sederhana untuk memeriksa apakah token akses pengguna 100000726976284 adalah xxxxxx. Saya kira yang 'terverifikasi' adalah kuncinya. Hanya ketika saya memasukkan xxxxxx yang benar, saya dapat melihat verifikasi = true dalam tanggapannya.
Jadi Jae Kyung
14
Minta graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx seperti yang disebutkan di atas, lalu periksa apakah uid yang Anda miliki cocok dengan id yang dikirimkan kembali dari permintaan.
AlexQueue
51
Ini tidak akan memeriksa bahwa access_token untuk aplikasi Anda.
Ed Sykes
Juga tidak memberikan expires_atinfo.
vinesh
4
downvoting, setuju dengan @EdSykes, dengan cara ini Anda tidak dapat memeriksa apakah token akses milik pengembang
Anda.facebook.com/docs/facebook-login/security
35

Hanya ingin memberi tahu Anda bahwa hingga hari ini saya pertama kali mendapatkan token akses aplikasi (melalui permintaan GET ke Facebook), dan kemudian menggunakan token yang diterima sebagai app-token-or-admin-tokendi:

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

Namun, saya baru saja menyadari cara yang lebih baik untuk melakukan ini (dengan manfaat tambahan yang membutuhkan lebih sedikit permintaan GET):

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

Seperti yang dijelaskan dalam dokumentasi Facebook untuk Token Akses di sini .

Andy
sumber
6
Terima kasih. Catatan untuk orang lain: literal "|" karakter harus disertakan (yang tidak menunjukkan 'atau') seperti yang ditunjukkan pada halaman yang ditautkan ke dalam jawaban: developers.facebook.com/docs/facebook-login/…
Mike S
1
Bukankah ini tidak aman? Mengirimkan rahasia aplikasi melalui parameter kueri URL memaparkannya kepada siapa pun yang "di tengah" antara server Anda dan Facebook dan HTTPS tidak akan membantu, karena URL tidak dienkripsi. Siapa pun bisa "mendengarkan" (mengendus) permintaan dengan URL dalam format debug_token dan mencuri rahasia aplikasi Facebook.
Simeon
@ Terima kasih, saya lihat saya mendapat kesan yang salah :) Sepertinya hanya bagian host dari URL yang tidak dienkripsi.
Simeon
1
Menambahkan '|' dengan rahasia aplikasi akhirnya membuat saya pergi. Jika tidak, API ini tidak berfungsi.
Uday
4

Cukup minta (HTTP GET):

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

Itu dia.

Nadav B
sumber
1

Pertukaran Access Tokenuntuk Mobile Number and Country Code(Sisi Server ATAU Sisi Klien)

Anda bisa mendapatkan mobile numberdengan Anda access_tokendengan ini API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Mungkin, setelah Anda memiliki mobile numberdan id, Anda dapat bekerja dengannya untuk memverifikasi pengguna dengan Anda server & database.

xxxxxxxxxx di atas adalah Access Token

Contoh Respon:

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


Tukarkan Auth Codeuntuk Access Token(Sisi Server)

Jika Anda punya Auth Code, Anda bisa mendapatkannya terlebih dahulu Access Tokendengan ini API- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AAi>yyyyyyyyyyi>zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyydan di zzzzzzzzzzatasnya adalah Auth Code, App IDdan App Secretmasing - masing.

Contoh Respon

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

Catatan - Ini lebih disukai server-sidekarena APIkebutuhan APP Secretyang tidak dimaksudkan shareduntuk security reasons.

Semoga berhasil.

Akash
sumber