Validasi sisi server token akses Facebook untuk aplikasi iPhone

112

Saya sedang mengembangkan aplikasi iPhone, yang didasarkan pada komunikasi dengan server, dan saya ingin menggunakan mekanisme otentikasi Facebook.

Pada dasarnya, menurut saya seharusnya berfungsi seperti ini:

  1. Di aplikasi iPhone saya, pengguna masuk ke Facebook, menggunakan email dan kata sandinya.
  2. Pengguna mengizinkan akses ke datanya untuk aplikasi Facebook terkait.
  3. Aplikasi iPhone saya menerima token akses, setelah berhasil masuk.
  4. Dalam komunikasi lebih lanjut dengan server saya, aplikasi iPhone saya harus menggunakan token akses Facebook yang diterima (misalnya: dalam kueri).
  5. Ketika server saya menerima beberapa pertanyaan dari aplikasi iPhone, dengan token akses, itu harus menanyakan Facebook bahwa token ini valid (dan untuk siapa), dan jika ya, server harus menganggap bahwa pengguna diautentikasi dengan Facebook.

Pertanyaan saya adalah: bagaimana server harus bertanya kepada Facebook jika token akses yang diberikan valid? Saya rasa saya harus memeriksa apakah token tersebut valid untuk aplikasi Facebook saya.

Saya telah mencoba banyak kueri Facebook untuk membuat grafik API, yang saya temukan, tetapi tidak ada yang berfungsi seperti yang saya harapkan. Bisakah Anda memberi saya beberapa contoh?

Marcin
sumber
5
Kecuali jika pengguna telah keluar dari aplikasi di FB, Anda cukup mengirim token autentikasi ke server (ssl berharap). Apakah kueri sederhana "/ saya" melalui api grafik berhasil atau gagal?
The Mad Gamer
Anda akan mendapatkan pesan sebagai balasan dari facebook bahwa token Anda tidak valid :)
Jean-Luc Godard
1
Saya mencoba melakukan sesuatu yang sangat mirip dengan apa yang Anda lakukan. Anda tidak pernah menandai pertanyaan ini sebagai jawaban, apakah Anda pernah membuatnya berfungsi?
tempy
Apa yang terjadi ketika access_token kedaluwarsa? haruskah kita meminta pengguna untuk masuk lagi? saya ingin memahami bagaimana memvalidasi ulang lagi setelah token kedaluwarsa
debianmaster
@debianmaster itu tergantung pada arsitektur aplikasi Anda. Jika Anda menganggap kasus "tidak ada token FB - tidak ada akses ke aplikasi", maka ya, logout pengguna. Jika tidak, Anda dapat mempertimbangkan logika "unlink", di mana pengguna tetap login, tetapi info yang diterima dari Facebook terlepas dari akunnya di server / klien.
Yevhen Dubinin

Jawaban:

115

Berikut adalah proses dua langkah yang dapat Anda gunakan untuk memvalidasi bahwa token akses pengguna adalah milik Aplikasi Anda:

1) Buat token Akses Aplikasi

( 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) Debug token Akses Pengguna

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

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

Jika INPUT_TOKEN adalah token akses pengguna yang ingin Anda verifikasi, dan ACCESS_TOKEN adalah token aplikasi Anda yang Anda dapatkan dari langkah 1.

Endpoint debug pada dasarnya membuang semua informasi tentang token, jadi itu akan merespons dengan sesuatu seperti ini:

{
    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: [ ]
    }
}

Jika token itu bukan dari "aplikasi Anda" maka akan mengembalikan respons kesalahan.

sebastian si kepiting
sumber
13
Menurut Facebook , ini adalah cara yang benar untuk memeriksa token. Namun, bagian pertama bersifat opsional karena Anda dapat menggunakan id dan rahasia aplikasi Anda, bukan admin atau token aplikasi.
Brandon Zacharie
@BrandonZacharie Tidak melihat bagaimana Anda melakukan ini, saya hanya mencoba dengan id aplikasi dan rahasia dan memberi saya kesalahan untuk "parameter input_token diperlukan"
Johnny Z
@JohnnyZ token input diperlukan. Token akses adalah tempat fleksibilitas.
Brandon Zacharie
8
@BrandonZacharie Anda benar, saya bingung mendapatkan input dan token akses. Untuk menggunakan id dan rahasia aplikasi, saya meneruskan ini sebagai parameter dengan pipa sebagai pembatas: & access_token = APP_ID | APP_SECRET
Johnny Z
2
Tautan di atas sekarang menjadi developer.facebook.com/docs/facebook-login/access-tokens/…
Chris Prince
115

Pembaruan: jawaban ini tampaknya tidak aman karena tidak memvalidasi token terlebih dahulu sebagai milik aplikasi Anda, lihat komentar, jawaban asli sebagai berikut:

Saya berasumsi bahwa Anda sudah memiliki token akses di tangan. Dalam kasus seperti itu, cara termudah untuk memvalidasi token akses adalah dengan mengeluarkan permintaan berikut

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

Di sini ganti @accesstoken dengan token akses yang Anda miliki. Saya akan memecah url dan akan menjelaskan masing-masing.

Kami mengeluarkan permintaan api grafik di sini yang akan mengembalikan ID Pengguna Facebook dari pemilik token akses sebagai string JSON. Kata kunci 'saya' mewakili pengguna yang saat ini masuk atau pemilik token akses. Untuk token akses permintaan ini adalah parameter wajib.

Jika token akses yang diberikan tidak valid atau kedaluwarsa, Facebook hanya akan mengembalikan pesan kesalahan.

Untuk token akses yang valid, hasilnya akan terlihat seperti ini

{
   "id": "ID_VALUE"
}
Robin
sumber
14
Bukankah permintaan itu berhasil jika pengguna tersebut memberikan access_token yang dimiliki oleh aplikasi yang berbeda?
Yuriy Nemtsov
2
Setiap token akses pengguna yang valid dapat digunakan (apa pun aplikasinya)
Robin
12
@Xiquid posting ini bukanlah solusi untuk masalah karena tidak memvalidasi jika token akses milik aplikasi Anda.
Kolyunya
12
Saya tidak mengerti mengapa jawaban ini memiliki suara terbanyak! Ini JELAS bukan solusi yang tepat. Sebenarnya pendekatan yang benar adalah apa yang disarankan oleh "sebastian the crab". Endpoint debug_token digunakan untuk menanyakan informasi tentang token itu sendiri dan dengan cara ini Anda dapat memverifikasi bahwa token tersebut milik ID pengguna tertentu untuk ID aplikasi tertentu!
Alex Ntousias
4
Ya, jawaban ini tidak benar. Jika Anda memverifikasi token akses dengan cara ini, seseorang bisa mendapatkan token akses dari aplikasi lain dan menggunakannya untuk mengautentikasi dengan milik Anda.
Jonathan
11

Solusi lain adalah menggunakan https://graph.facebook.com/app/?access_token=[user_access_token]seperti yang dijelaskan oleh Dapatkan id aplikasi dari token akses pengguna (atau verifikasi aplikasi sumber untuk token) .

Tampaknya ini adalah fitur yang tidak terdokumentasi, tetapi menampilkan JSON yang berisi id aplikasi tempat token itu dibuat. Jika token bukan untuk aplikasi Anda, token akan mengembalikan 400.

Helen Williamson
sumber
Bagaimana saya bisa mendapatkan peringkat bisnis Facebook lainnya. Apa yang perlu saya lakukan untuk ini?
Maneesh Rao
6

Di facebook versi terbaru (2.2) Anda dapat melakukannya dengan cara ini:

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

Output sampel:

{
    "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
sumber
Apakah ini berarti Anda harus memanggil titik akhir fb ini pada setiap permintaan? Apakah tidak ada cara yang lebih baik?
Jdruwe
Ini berfungsi tetapi membutuhkan token akses. Token akses dapat dibuat menggunakan jawaban 'sebastian the crab' atau kita dapat menggunakan appid | appsecret. Fore more Info developers.facebook.com/docs/facebook-login/…
krishnan
Berikut adalah contoh penggunaan ini: 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");
}

Anda dapat mengunduh SDK Facebook untuk PHP dari GitHub .

Baptiste Costa
sumber
1

Jika seorang pengguna telah memberikan Anda Facebook UID yang mereka klaim adalah milik mereka dan Anda ingin memeriksa apakah itu sah, ini adalah fungsi Python yang akan memverifikasinya dengan token akses mereka (implementasi dari jawaban 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
sumber
Sayangnya, ini tidak memvalidasi bahwa token dibuat "untuk aplikasi Anda" ...
rogerdpack
1

Ini adalah satu-satunya metode aman untuk memverifikasi token pengguna hanya dengan satu permintaan:

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

Perhatikan bahwa tanda "|" pada URL di atas tidak digunakan sebagai OR tetapi sebagai pemisah dan harus ada setelah mengisi kolom lainnya.

Responsnya akan menjadi JSON seperti itu:

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

Referensi: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (metode di atas disebutkan di bagian bawah bagian ini)

Kamoris
sumber
Ada cara aman lainnya dengan satu permintaan: stackoverflow.com/a/36555287/32453
rogerdpack
-1

Bersama dengan token akses, Facebook juga mengirimkan parameter "expires_in", yang merupakan nilai offset. Gunakan itu untuk menghitung kapan token akses akan kedaluwarsa sebagai NSDate. Kemudian ketika Anda perlu melakukan permintaan bandingkan tanggal saat ini dengan tanggal kedaluwarsa.

Coba juga untuk memeriksa kode status dan string respons yang dikirim kembali oleh Facebook.

jcm
sumber