14

इस प्रश्न को स्टैक पर कुछ बार पूछा गया है, लेकिन कोई वास्तविक जवाब नहीं है। मुझे वैसे भी मेरी स्थिति को समझाने की कोशिश करें।फेसबुक ओएथ लॉगिन - access_token एपीआई लौटने "यह प्राधिकरण कोड का उपयोग किया गया है"

हम ऐसे एप्लिकेशन का उपयोग करते हैं जो फेसबुक OAuth2 लॉगिन का उपयोग करता है। यह लॉगिन पिछले हफ्ते तक ठीक काम करने के लिए प्रयुक्त होता था, और अचानक यह हमें अब परेशान कर रहा है।

आवेदन प्रवाह:

चरण 1: उपयोगकर्ता प्रेस हमारी वेबसाइट पर फेसबुक बटन के साथ लॉगिन

चरण 2: फेसबुक लॉगिन/प्राधिकरण पेज

चरण 3 पर रीडायरेक्ट किया : ऐप को अधिकृत करने पर, कॉलबैक हमारे आवेदन पर आता है, एक संक्षिप्त "कोड" परम के साथ।

चरण 4: यह "कोड" परम एक 60 दिन पहुँच टोकन का उपयोग कर "https://graph.facebook.com/oauth/access_token" यूआरएल के लिए आदान-प्रदान किया किया जाएगा।

चरण 4 में

त्रुटि:

जब हम पहुँच टोकन के लिए कम रहने "कोड" का आदान-प्रदान करने का प्रयास करें, हम फेसबुक से इस त्रुटि मिलती है।

{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}} 

अवलोकन:

  1. उपयोगकर्ताओं को, जो नव आवेदन करने के लिए आ रहे हैं के लिए, ऊपर-कहा त्रुटि नहीं होती है।
  2. एक लौटने वाले उपयोगकर्ता के लिए यह कॉल उपरोक्त त्रुटि के साथ विफल रहता है।
  3. हमारा आवेदन अब 9 महीने से अधिक समय तक लाइव है, और यह त्रुटि केवल पिछले 7-10 दिनों में आई है। हमारे पास हजारों उपयोगकर्ता इसका सफलतापूर्वक इसका उपयोग कर रहे हैं।

क्या मैं पहले से ही मंच से मिला:

यहाँ मैं क्या पढ़ा मेरी व्याख्या है। गलत हो सकता है। फेसबुक में कुछ अजीब नीति है जो ऐप डेवलपर को अस्थायी 10 मिनट कोड बनाए रखने के लिए जरूरी है जब तक कि पहले लॉगिन की अवधि के दौरान प्राप्त 60 दिन कोड न हो। तो हमें उपयोगकर्ता के ब्राउज़र पर एक्सेस टोकन के साथ एक कुकी बनाना चाहिए। मैं कुकीज बनाने के लिए लोगों को अपने कोड को संशोधित करने में भी सक्षम था।

वास्तव में मुझे क्या परेशान कर रहा है?

  1. सुझाए गए समाधान मानते हैं कि वे जो कुकी बनाते हैं वह हमेशा उपयोगकर्ता के ब्राउज़र में मौजूद होगी। यह एक बुरा धारणा है, क्योंकि किसी भी समय कुकी मिटा दी जा सकती है।
  2. मेरे पास एक और ऐप आईडी/ऐप रहस्य है जिसका उपयोग मैं अपने विकास (i.e localhost) के लिए करता हूं, और यह पूरी तरह से काम करता है। लॉगिन वहां ठीक होता है, लेकिन इसकी केवल उत्पाद मशीन है जिसमें समस्या है।
  3. इस समस्या को ऐप लॉन्च करने के लगभग 10 महीनों तक उत्पादन मशीन पर नहीं हुआ, और यह अचानक आ गया है। सबसे बुरी बात यह है कि, मैं इस प्रवाह को तोड़ने वाले हालिया परिवर्तनों का कोई रिकॉर्ड प्राप्त करने में असमर्थ हूं।

संपादित करें:

प्लेटफार्म: अजगर, गूगल AppEngine। हम किसी भी फेसबुक एसडीके का उपयोग नहीं करते हैं, हम सभी लॉगिन यूआरएल पर सीधे HTTP कॉल करते हैं। कॉल विफल रहता है: https://graph.facebook.com/oauth/access_token - हम पहली कॉल होने के 20 सेकंड के भीतर ऐप आईडी, गुप्त और कोड (फेसबुक से प्राप्त) पास कर रहे हैं।

आशा है कि यह दिखाने के लिए यहां पर्याप्त जानकारी है कि हमारा कोड पूरी तरह से गलत नहीं है। इस समस्या का सामना करने और हल करने वाले लोगों की कोई भी सुझाव/पॉइंटर्स आपका स्वागत है। यदि यह एक फेसबुक बग है, और फेसबुक देव नोटिस के लिए आता है, तो मैं भी खुश होगा।

+0

कोड पैरामीटर केवल एक बार उपयोगकर्ता पहुंच टोकन के लिए आदान-प्रदान किया जा सकता है। आपके प्रश्न का उपयोग करने वाले प्लेटफ़ॉर्म/भाषा के बारे में कोई भी उपयोगी जानकारी अनुपलब्ध है, और आपकी सटीक API कॉल क्या हैं। – CBroe

+0

@CBroe - अधिसूचना के लिए धन्यवाद। हां - हम समझते हैं कि कोड पैराम एक बार बात है, और यही कारण है कि हम इसे access_token के लिए एक्सचेंज करना चाहते हैं, लेकिन एक्सेस टोकन यूआरएल असफल हो रहा है। मैंने मंच/भाषा के बारे में जानकारी शामिल की है। – Srivatsan

उत्तर

0

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

+0

मुझे यह समस्या भी थी। फेसबुक PHP एसडीके का उपयोग करने से पहले जब मैं ऊपर चरण 4 (graph.facebook.com/oauth/access_token) को कॉल करता हूं तो यह ठीक काम करता है। लेकिन अगर मैं इसे बाद में कॉल करता हूं, तो मुझे "यह प्राधिकरण कोड का उपयोग किया गया है"। एसडीके में संग्रहीत टोकन एंडपॉइंट द्वारा लौटाए गए एक से अलग प्रारूप है, और मुझे एसडीके में एक समाप्ति तिथि नहीं दिखाई दे रही है।इसलिए, यदि ये टोकन अलग हैं, तो फेसबुक इस मामले में त्रुटि क्यों लौटाता है? –

4

मुझे एक यादृच्छिक GUID का उपयोग करके इस मुद्दे को मिला जो कि प्रत्येक कॉलबैक यूआरएल में शामिल है जिसे मैं फेसबुक में भेजता हूं। ऐसा लगता है कि फेसबुक रिटर्न कुछ हिस्सों से बना है जिसमें आपको निर्दिष्ट करने के लिए redirect_uri पैरामीटर शामिल है। इस GUID चाल का उपयोग करके, आपका ऐप काम करना जारी रखता है लेकिन फेसबुक सोचता है कि यह एक अलग यूआरएल है इसलिए एक नया कोड उत्पन्न करना।

यदि आप उस GUID को अस्थायी सत्र में संग्रहीत करते हैं, तो यह हमेशा वही होता है। मेरा मतलब है कि यहां एक बहुत ही कट ऑफ संस्करण है। मैं सी # का उपयोग कर रहा हूँ, लेकिन समाधान ही होगा:

इससे पहले कि मैं OAuth की प्रक्रिया शुरू:

Session["facebook_buster"] = System.Guid.NewGuid().ToString(); 

फिर लॉगिन शुरू करने के लिए: मेरे कॉलबैक में

var facebook = new FacebookClient(); 

var loginUrl = facebook.GetLoginUrl(new 
{ 
    client_id = ..., 
    redirect_uri = ..."/facebook/oauthcallback?buster=" + Session["facebook_buster"].ToString(), 
    display = "popup", 
    scope = "publish_stream,user_photos" 
}); 

और फिर विधि, जब मैं एक नया ACCESS_TOKEN के लिए कि कोड का आदान-प्रदान करना चाहते हैं: कि दूसरी विधि में

var facebook = new FacebookClient(); 

dynamic result = facebook.Post("oauth/access_token", new 
{ 
    client_id = ..., 
    client_secret = ..., 
    redirect_uri = ..."/facebook/oauthcallback?buster=" + Session["facebook_buster"].ToString(), 
    code = Request["code"] // this is the returned code from the first method 
}); 

नोट मैं उसी हूँ उसी सत्र कुंजी को एनजी ताकि प्राधिकरण कोड सफल हो।

अनुमतियों को वापस लेना/हस्तचालित रूप से अपने संग्रहीत ACCESS_TOKEN बदलते (मेरी DB में) द्वारा सभी सुबह इस परीक्षण किया/हटाने के मेरी पूरी तरह से ACCESS_TOKEN संग्रहीत और यह हर बार काम करता है।

आशा है कि इससे मदद मिलती है!

+1

कोई सिगार नहीं, https://github.com/HabitRPG/habitrpg/issues/4221#issuecomment-61855507 – lefnire

+0

धन्यवाद श्रीमान। पहली नज़र में मैं ऐसा काम नहीं करना चाहता था। लेकिन मैंने इसे PHP और voila में कार्यान्वित किया! लंबे समय तक पहुंच टोकन फिर से। इस समस्या के लिए नए आने वालों के लिए, फेसबुक को दीर्घकालिक कोड की पीढ़ी में अपने 'redirect_uri' पैरामीटर का उपयोग करना होगा। अनिवार्य रूप से हम 10 मिनट के गुजरने के बिना अद्वितीय दीर्घकालिक कोड बनाने में अपने एल्गोरिदम को धोखा दे रहे हैं। बिल्कुल प्रतिभा। –

+0

सिर्फ एक एफवाईआई, PHP में लॉगिन यूआरएल प्राप्त करते समय, मेरे रीडायरेक्ट_री में कैश ब्रेकर पैरामेट जोड़ा गया, और यह वही परिणाम मिला, मुझे लगता है .. यह काम करता है .. :) इस त्रुटि को एफबी के साथ विश्वास नहीं कर सकता। थोड़े हास्यास्पद? यह कह रहा था कि मैंने पहले ही ऑथ कोड का उपयोग किया है, अगर मैंने रीडायरेक्ट_री को पिछले ऑथ प्रयास के समान रखा है? वास्तव में उलझन में, ओह ठीक है। – jfaron

संबंधित मुद्दे