IPhone ऐप के लिए फेसबुक एक्सेस टोकन-साइड सत्यापन


112

मैं iPhone एप्लिकेशन विकसित कर रहा हूं, जो सर्वर के साथ संचार पर आधारित है, और मैं फेसबुक प्रमाणीकरण तंत्र का उपयोग करना चाहता हूं।

मूल रूप से, मुझे लगता है कि इसे इस तरह काम करना चाहिए:

  1. मेरे iPhone ऐप में, उपयोगकर्ता अपने ईमेल और पासवर्ड का उपयोग करके फेसबुक में लॉग इन करता है।
  2. उपयोगकर्ता संबंधित फेसबुक एप्लिकेशन के लिए अपने डेटा तक पहुंच की अनुमति देता है।
  3. सफल लॉग इन के बाद मेरा iPhone ऐप एक्सेस टोकन प्राप्त करता है।
  4. अपने सर्वर के साथ आगे संचार में, मेरे iPhone एप्लिकेशन को प्राप्त फेसबुक एक्सेस टोकन (उदाहरण के लिए: प्रश्नों में) का उपयोग करना चाहिए।
  5. जब मेरा सर्वर iPhone ऐप से कुछ क्वेरी प्राप्त करता है, तो एक्सेस टोकन के साथ, उसे फेसबुक से पूछना चाहिए कि यह टोकन वैध है (और कौन है), और यदि हाँ, तो सर्वर को यह मान लेना चाहिए कि उपयोगकर्ता फेसबुक के साथ प्रमाणित है।

मेरा प्रश्न है: यदि पहुँच टोकन मान्य है, तो सर्वर को फेसबुक से कैसे पूछना चाहिए? मुझे लगता है कि मुझे किसी तरह से जांचना चाहिए कि क्या टोकन मेरे फेसबुक ऐप के लिए वैध है।

मैंने API से ग्राफ़ करने के लिए कई फेसबुक क्वेरीज़ की कोशिश की है, जो मैंने पाया है, लेकिन जैसा मैंने उम्मीद की थी, वैसा कुछ भी नहीं हुआ। क्या आप मुझे कुछ उदाहरण प्रदान कर सकते हैं?


5
जब तक कि उपयोगकर्ता FB में ऐप से लॉग आउट नहीं होता है, तब तक आप सर्वर पर संपूर्ण टोकन भेज सकते हैं (ssl hopefuly)। ग्राफ एपीआई के माध्यम से "/ me" की एक सरल क्वेरी सफल या असफल होती है?
मैड गेमर

आपको फेसबुक से जवाब में संदेश मिलेगा कि आपका टोकन वैध नहीं है :)
जीन-ल्यूक गोडार्ड

1
मैं बहुत कुछ करने की कोशिश कर रहा हूँ जो आप कर रहे हैं। आपने कभी इस प्रश्न को उत्तर के रूप में चिह्नित नहीं किया, क्या आपको कभी यह काम मिला?
टेम्पी

क्या होता है जब access_token समाप्त हो जाता है? क्या हमें उपयोगकर्ता को फिर से लॉगिन करने के लिए कहना चाहिए? मैं समझना चाहता हूं कि टोकन समाप्त होने के बाद फिर से कैसे मान्य किया जाए
डेबियनमास्टर

@debianmaster यह आपके ऐप आर्किटेक्चर पर निर्भर करता है। यदि आप इस मामले पर विचार करते हैं कि "कोई एफबी टोकन - ऐप का कोई एक्सेस नहीं है", तो हाँ, उपयोगकर्ता को लॉग आउट करें। अन्यथा, आप "अनलिंक" तर्क पर विचार कर सकते हैं, जहां उपयोगकर्ता लॉग इन रहता है, लेकिन फेसबुक से प्राप्त जानकारी सर्वर / क्लाइंट पर उसके खाते से अलग कर दी जाती है।
येविन दुबीनिन

जवाबों:


115

यहां दो चरण की प्रक्रिया है जिसका उपयोग करके आप यह प्रमाणित कर सकते हैं कि उपयोगकर्ता की पहुंच टोकन आपके ऐप से है:

1) एक ऐप एक्सेस टोकन जेनरेट करें

( 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) उपयोगकर्ता एक्सेस टोकन को डीबग करें

( 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 उपयोगकर्ता एक्सेस टोकन है जिसे आप सत्यापित करना चाहते हैं, और ACCESS_TOKEN आपके ऐप का टोकन है जो आपको चरण 1 से मिला है।

डिबग समापन बिंदु मूल रूप से एक टोकन के बारे में सभी जानकारी को मिटा देता है, इसलिए यह इस तरह से कुछ के साथ जवाब देगा:

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

यदि वह टोकन "आपके ऐप" से नहीं है तो यह एक त्रुटि प्रतिक्रिया देगा।


13
फेसबुक के अनुसार , यह टोकन का निरीक्षण करने का सही तरीका है। हालाँकि, पहला भाग वैकल्पिक है क्योंकि आप किसी व्यवस्थापक या ऐप टोकन के बजाय अपनी ऐप आईडी और गुप्त का उपयोग कर सकते हैं।
ब्रैंडन ज़ाचरी

@BrandonZacharie यह न देखें कि आप यह कैसे करते हैं, मैंने सिर्फ ऐप आईडी और सीक्रेट के साथ कोशिश की और मुझे "input_token पैरामीटर की आवश्यकता है" के लिए त्रुटि दी
जॉनी जेड

@ जॉननी इनपुट टोकन की आवश्यकता है। पहुँच टोकन जहाँ लचीलापन है।
ब्रैंडन ज़ाचरी

8
@BrandonZacharie आप सही कह रहे हैं, मुझे उलझन में इनपुट और एक्सेस टोकन मिल रहे थे। ऐप आईडी और सीक्रेट का उपयोग करने के लिए मैं इसे एक सीमांकक के रूप में पाइप के साथ एक पैरामीटर के रूप में पारित करता हूं: & access_token: APP_ID | APP_SECRET
जॉनी जेड


115

अपडेट: यह उत्तर असुरक्षित लगता है क्योंकि यह आपके ऐप से संबंधित पहले टोकन को मान्य नहीं करता है, टिप्पणियों को देखें, मूल उत्तर इस प्रकार है:

मुझे लगता है कि आपके पास पहले से ही हाथ में टोकन है। ऐसे मामले में एक पहुंच टोकन को मान्य करने का सबसे सरल तरीका निम्नलिखित अनुरोध जारी करना है

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

यहाँ आपके पास पहुँच टोकन के साथ @accesstoken को बदलें। मैं यूआरएल को तोड़ दूंगा और प्रत्येक को समझाऊंगा।

हम यहां एक ग्राफ एपीआई अनुरोध जारी कर रहे हैं जो JSON स्ट्रिंग के रूप में एक्सेस टोकन के मालिक के फेसबुक यूजर आईडी को वापस कर देगा। कीवर्ड 'मी' वर्तमान में उपयोगकर्ता या लॉग इन टोकन के स्वामी को दर्शाता है। इस अनुरोध के लिए एक्सेस टोकन एक अनिवार्य पैरामीटर है।

यदि प्रदान की गई पहुँच टोकन मान्य नहीं है या समाप्त हो गई है तो फेसबुक बस किसी प्रकार का त्रुटि संदेश लौटा देगा।

एक वैध पहुँच टोकन के लिए परिणाम किसी तरह इस तरह दिखेगा

{
   "id": "ID_VALUE"
}

14
क्या वह अनुरोध सफल नहीं होगा यदि उस उपयोगकर्ता ने एक access_token प्रदान किया है जो एक अलग ऐप से संबंधित है?
युरी नेम्त्सोव

2
किसी भी मान्य उपयोगकर्ता पहुँच टोकन का उपयोग किया जा सकता है (कोई भी बात नहीं है कि यह किस ऐप से संबंधित है)
रॉबिन

12
@ यह पोस्ट समस्या का समाधान नहीं है क्योंकि यह मान्य नहीं है यदि एक्सेस टोकन आपके एप्लिकेशन से संबंधित है।
कोलुय्या

12
मुझे समझ में नहीं आता कि इस उत्तर में सबसे अधिक वोट क्यों हैं! यह पूरी तरह से सही समाधान नहीं है। वास्तव में, सही दृष्टिकोण "सेबैस्टियन द क्रैब" है जो सुझाया गया है। Debug_token समापन बिंदु का उपयोग टोकन के बारे में जानकारी क्वेरी करने के लिए किया जाता है और इस तरह से आप यह सत्यापित कर सकते हैं कि टोकन विशिष्ट ऐप आईडी के लिए विशिष्ट उपयोगकर्ता आईडी से संबंधित है!
एलेक्स Ntousias

4
हाँ, यह उत्तर सही नहीं है। यदि आप एक्सेस टोकन को इस तरह से सत्यापित करते हैं, तो कोई व्यक्ति किसी अन्य एप्लिकेशन से एक्सेस टोकन प्राप्त कर सकता है और इसका उपयोग आपके साथ प्रमाणित करने के लिए कर सकता है।
जोनाथन

11

एक अन्य समाधान यह होगा कि यूजर एक्सेस टोकन से प्राप्त एप्लिकेशन आईडीhttps://graph.facebook.com/app/?access_token=[user_access_token] द्वारा वर्णित के रूप में उपयोग किया जाए (या टोकन के लिए स्रोत एप्लिकेशन को सत्यापित करें)

यह एक अनिर्दिष्ट सुविधा प्रतीत होती है, लेकिन JSON रिटर्न में ऐप के आईडी युक्त टोकन के लिए जनरेट किया गया था। यदि टोकन आपके ऐप के लिए नहीं था, तो यह 400 का रिटर्न देता है।


मैं अन्य फेसबुक व्यवसाय की रेटिंग कैसे प्राप्त कर सकता हूं। इसके लिए मुझे क्या करने की आवश्यकता है?
मनेश राव

6

Facebook (2.2) के नवीनतम संस्करण में आप इसे इस तरह से कर सकते हैं:

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

नमूना उत्पादन:

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

क्या इसका मतलब है कि आपको प्रत्येक अनुरोध पर इस fb समापन बिंदु को कॉल करना होगा? क्या कोई दांव नहीं है?
Jdruwe

यह काम करता है लेकिन इसे एक्सेस टोकन की आवश्यकता होती है। एक्सेस टोकन b सेबेस्टियन द क्रैब ’उत्तर का उपयोग करके उत्पन्न किया जा सकता है या हम बस एपिड का उपयोग कर सकते हैं। अधिक जानकारी के लिए Developers.facebook.com/docs/facebook-login/…
krishnan

इसका एक उदाहरण यहां दिया गया है: 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");
}

आप GitHub से PHP के लिए Facebook SDK डाउनलोड कर सकते हैं ।


1

यदि किसी उपयोगकर्ता ने आपको एक फेसबुक यूआईडी पास किया है जो दावा करता है कि यह उनका है और आप यह देखना चाहते हैं कि क्या यह वैध है, तो यह पायथन फ़ंक्शन है जो इसे उनके एक्सेस टोकन (रॉबिन जोम के जवाब का कार्यान्वयन) के खिलाफ सत्यापित करेगा:

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

यह मान्य नहीं है कि टोकन आपके ऐप के लिए "दुर्भाग्य से" उत्पन्न किया गया था ...
rogerdpack

1

यह केवल एक अनुरोध का उपयोग करके उपयोगकर्ता टोकन को सत्यापित करने का एकमात्र सुरक्षित तरीका है:

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

ध्यान दें कि एक चिन्ह "|" उपरोक्त URL का उपयोग OR या विभाजक के रूप में नहीं किया गया है और अन्य फ़ील्ड भरने के बाद होना चाहिए।

प्रतिक्रिया JSON की तरह लग रही होगी:

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

संदर्भ: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (इस खंड के नीचे विधि का उल्लेख किया गया है)


एक अनुरोध के साथ एक और सुरक्षित तरीका है: stackoverflow.com/a/36555287/32453
rogerdpack

-1

एक पहुंच टोकन फेसबुक के साथ एक "expires_in" पैरामीटर भी भेजता है, जो एक ऑफसेट मूल्य है। उस का उपयोग करें, जब पहुँच टोकन NSDate के रूप में समाप्त हो जाएगा। फिर जब आपको अनुरोध करने की आवश्यकता होती है तो समाप्ति तिथि की वर्तमान तिथि की तुलना करें।

इसके अलावा स्टेटस कोड और रिस्पांस स्ट्रिंग्स का निरीक्षण करने का प्रयास करें जिसे फेसबुक वापस भेजता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.