İPhone uygulaması için Facebook erişim belirteci sunucu tarafı doğrulaması


112

Sunucuyla iletişime dayalı iPhone uygulaması geliştiriyorum ve Facebook kimlik doğrulama mekanizmalarını kullanmak istiyorum.

Temel olarak, şu şekilde çalışması gerektiğini düşünüyorum:

  1. İPhone uygulamamda, kullanıcı e-posta ve şifresini kullanarak Facebook'ta oturum açıyor.
  2. Kullanıcı, ilgili Facebook uygulaması için kendi verilerine erişime izin verir.
  3. İPhone uygulamam başarılı bir şekilde oturum açtıktan sonra erişim belirteci alıyor.
  4. Sunucumla daha sonraki iletişimde, iPhone uygulamam alınan Facebook erişim belirtecini kullanmalıdır (örneğin: sorgularda).
  5. Sunucum iPhone uygulamasından erişim belirteci içeren bir sorgu aldığında, Facebook'a bu belirtecin geçerli (ve kim için) olduğunu sormalı ve eğer öyleyse, sunucu kullanıcının Facebook ile kimlik doğrulamasının yapıldığını varsaymalıdır.

Sorum şu: erişim belirtecinin geçerli olup olmadığını sunucu Facebook'a nasıl sormalı? Sanırım jetonun Facebook uygulamam için geçerli olup olmadığını bir şekilde kontrol etmeliyim.

Bulduğum API grafiğini çizmek için birçok Facebook sorgusu denedim, ancak hiçbir şey beklediğim gibi çalışmadı. Bana bir örnek verebilir misin?


5
Kullanıcı FB'de uygulamadan çıkış yapmadıysa, kimlik doğrulama jetonunu sunucuya gönderebilirsiniz (umutlu ssl). Grafik api aracılığıyla basit bir "/ ben" sorgusu başarılı mı yoksa başarısız mı?
The Mad Gamer

Facebook'tan token'ınızın geçerli olmadığına dair bir mesaj alacaksınız :)
Jean-Luc Godard

1
Senin yaptığına çok benzer bir şey yapmaya çalışıyorum. Bu soruyu yanıt olarak hiç işaretlemediniz, hiç işe yaradınız mı?
tempy

Access_token'ın süresi dolduğunda ne olur? kullanıcıdan tekrar giriş yapmasını istemeli miyiz? belirtecin süresi dolduktan sonra nasıl yeniden doğrulayacağımı anlamak istiyorum
debianmaster

@debianmaster, uygulamanızın mimarisine bağlıdır. Evet yerine "FB belirteci yok - uygulamaya erişim yok" durumunu düşünüyorsanız, kullanıcı oturumunu kapatın. Aksi takdirde, kullanıcının oturum açmış halde kaldığı, ancak Facebook'tan alınan bilgilerin sunucudaki / istemcideki hesabından ayrıldığı bir "bağlantı kesme" mantığını düşünebilirsiniz.
Yevhen Dubinin

Yanıtlar:


115

Bir kullanıcı erişim belirtecinin Uygulamanıza ait olduğunu doğrulamak için kullanabileceğiniz iki aşamalı bir işlem aşağıda verilmiştir:

1) Bir Uygulama Erişim jetonu oluşturun

( 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) Kullanıcı Erişim belirtecinde hata ayıklayın

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

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

INPUT_TOKEN, doğrulamak istediğiniz kullanıcı erişim jetonudur ve ACCESS_TOKEN, 1. adımdan aldığınız uygulamanızın jetonudur.

Hata ayıklama uç noktası temelde bir belirteç hakkındaki tüm bilgileri döker, bu nedenle aşağıdaki gibi bir şeyle yanıt verir:

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

Bu simge "uygulamanızdan" değilse bir hata yanıtı verir.


13
Facebook'a göre , jetonları incelemenin doğru yolu bu. Ancak, yönetici veya uygulama jetonu yerine uygulama kimliğinizi ve sırrınızı kullanabileceğiniz için ilk bölüm isteğe bağlıdır.
Brandon Zacharie

@BrandonZacharie Bunu nasıl yaptığınızı görmüyorum, sadece uygulama kimliği ve sırrı ile denedim ve "input_token parametresi gerekli" için bana hata verdim
Johnny Z

@JohnnyZ giriş belirteci gerekli. Erişim belirteci esnekliğin olduğu yerdir.
Brandon Zacharie

8
@BrandonZacharie Haklısınız, giriş ve erişim belirteçleri karıştı. Uygulama kimliğini ve sırrını kullanmak için buna sınırlayıcı olarak boru ile bir parametre olarak geçtim: & access_token = APP_ID | APP_SECRET
Johnny Z


115

Güncelleme: Bu yanıt , jetonun ilk önce uygulamanıza ait olduğunu doğrulamadığından güvensiz görünüyor , yorumlara bakın, orijinal yanıtı aşağıdaki gibi:

Erişim belirtecinin zaten elinizde olduğunu varsayıyorum. Böyle bir durumda bir erişim belirtecini doğrulamanın en basit yolu, aşağıdaki isteği yayınlamaktır.

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

Burada @accesstoken'ı sahip olduğunuz erişim jetonuyla değiştirin. URL'yi parçalayacağım ve her birini açıklayacağım.

Burada, erişim belirtecinin sahibinin Facebook Kullanıcı Kimliğini JSON dizesi olarak döndürecek bir grafik api isteği yayınlıyoruz. 'Ben' anahtar kelimesi, o anda oturum açmış olan kullanıcıyı veya erişim belirtecinin sahibini temsil eder. Bu istek için erişim belirteci zorunlu bir parametredir.

Sağlanan erişim belirteci geçerli değilse veya süresi dolmuşsa, Facebook bir tür hata mesajı verecektir.

Geçerli bir erişim belirteci için sonuç bir şekilde şöyle görünecektir

{
   "id": "ID_VALUE"
}

14
Bu kullanıcı, farklı bir uygulamaya ait bir erişim belirteci sağlasa bu istek başarılı olmaz mıydı?
Yuriy Nemtsov

2
Herhangi bir geçerli kullanıcı erişim belirteci kullanılabilir (hangi uygulamaya ait olursa olsun)
Robin

12
@Xiquid Bu gönderi, erişim belirtecinin uygulamanıza ait olup olmadığını doğrulamadığı için sorunun çözümü değildir.
Kolyunya

12
Bu cevabın neden en çok oyu aldığını anlamıyorum! KESİNLİKLE doğru çözüm değil. Aslında doğru yaklaşım "sebastian the crab" ın önerdiğidir. Debug_token uç noktası, belirtecin kendisi hakkındaki bilgileri sorgulamak için kullanılır ve bu şekilde belirtecin belirli bir uygulama kimliği için belirli bir kullanıcı kimliğine ait olduğunu doğrulayabilirsiniz!
Alex Ntousias 01

4
Evet, bu cevap doğru değil. Erişim jetonunu bu şekilde doğrularsanız, birisi farklı bir uygulamadan erişim jetonu alabilir ve sizinki ile kimlik doğrulaması yapmak için kullanabilir.
Jonathan

11

Başka bir çözüm , Kullanıcı erişim belirtecinden uygulama kimliğini alhttps://graph.facebook.com/app/?access_token=[user_access_token] tarafından açıklandığı gibi kullanmak (veya bir belirteç için kaynak uygulamayı doğrulamak) olacaktır .

Bu, belgelenmemiş bir özellik gibi görünüyor, ancak jetonun oluşturulduğu uygulamanın kimliğini içeren JSON döndürüyor. Jeton, uygulamanız için değilse 400 değerini döndürür.


Diğer Facebook işletmelerinin derecelendirmelerini nasıl alabilirim? Bunun için ne yapmam gerekiyor?
Maneesh Rao

6

Facebook'un en son sürümünde (2.2) bunu şu şekilde yapabilirsiniz:

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

Örnek çıktı:

{
    "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"
    }
}

Bu, her istekte bu fb uç noktasını çağırmanız gerektiği anlamına mı geliyor? Daha iyi bir yol yok mu?
Jdruwe

Bu çalışır ancak erişim belirteci gerektirir. Erişim belirteci 'sebastian the crab' cevabı kullanılarak oluşturulabilir veya sadece appid | appsecret kullanabiliriz. Daha fazla bilgi için developer.facebook.com/docs/facebook-login/…
krishnan

İşte bunun bir örnek kullanımı: 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");
}

PHP için Facebook SDK'yı GitHub'dan indirebilirsiniz .


1

Bir kullanıcı size kendisinin olduğunu iddia ettiği bir Facebook UID'sini ilettiyse ve bunun yasal olup olmadığını kontrol etmek istiyorsanız, bu, erişim belirtecine göre doğrulayacak bir Python işlevidir (Robin Jome'un cevabının bir uygulaması):

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

Bu, maalesef jetonun "uygulamanız için" oluşturulduğunu doğrulamıyor ...
rogerdpack

1

Bu, kullanıcı jetonunu tek bir istek kullanarak doğrulamanın tek güvenli yöntemidir:

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

Bir "|" Yukarıdaki URL, VEYA olarak değil ayırıcı olarak kullanılır ve diğer alanları doldurduktan sonra orada bulunmalıdır.

Yanıt şu şekilde JSON olacaktır:

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

Referans: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (yukarıdaki yöntem bu bölümün altında belirtilmiştir)


Bir istekle başka bir güvenli yol daha var: stackoverflow.com/a/36555287/32453
rogerdpack

-1

Bir erişim belirtecinin yanı sıra Facebook, bir ofset değeri olan "expires_in" parametresi de gönderir. Erişim belirtecinin NSDate olarak ne zaman sona ereceğini hesaplamak için bunu kullanın. Sonra bir talep yapmanız gerektiğinde, geçerli tarihi son kullanma tarihiyle karşılaştırın.

Ayrıca Facebook'un geri gönderdiği durum kodlarını ve yanıt dizelerini de incelemeye çalışın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.