6

तक पहुंचने के लिए फ़ायरबेस एथ का उपयोग करना मैं AngularJS, Firebase (SDK v3) और Google कैलेंडर API का उपयोग कर एक वेब एप्लिकेशन बना रहा हूं। मैं Google OAuth का उपयोग कर उपयोगकर्ताओं को प्रमाणित कर रहा हूं। मेरा उद्देश्य फायरबेस में डेटाबेस नोड्स से कैलेंडर ईवेंट बनाने में सक्षम होना है। अब तक मैं के साथ कैलेंडर गुंजाइश पर पहुंच के लिए प्रबंधित किया है:Google कैलेंडर API

_fbAuthObject.getRedirectResult() 
    .then(function _readToken(result) { 
     if (result.credential) { 
     _googleToken = result.credential.accessToken; 
     var authHeader = 'Bearer '+ _googleToken; 

     // Just a test call to the api, returns 200 OK 
     $http({ 
      method: 'GET', 
      headers: { 
      'Authorization': authHeader 
      }, 
      url: 'https://www.googleapis.com/calendar/v3/users/me/calendarList/primary' 
     }) 
      .then(function success(response) { 
      console.log('Cal response', response); 
      }, 
      function error(response) { 
      console.log('Error', response); 
      }); 

हालांकि, यह की तरह लगता है:

_authProvider = new firebase.auth.GoogleAuthProvider(); 
// Get permission to manage Calendar 
_authProvider.addScope("https://www.googleapis.com/auth/calendar"); 
_fbAuthObject.signInWithRedirect(_authProvider); 

मैं इतना प्रमाणीकरण रीडायरेक्ट रीडायरेक्ट प्रवाह के साथ के सत्यापन कर रहा हूँ के रूप में उपलब्ध है प्रारंभिक लॉगिन के बाहर फायरबेस एसडीके के माध्यम से Google एक्सेस टोकन प्राप्त करना संभव नहीं है। ऐसा लगता है कि फायरबेस जेडब्ल्यूटी टोकन तक पहुंचना संभव है, कैलेंडर एपीआई के साथ कोई उपयोग नहीं है। मैं एक्सेस टोकन स्टोर कर सकता हूं, लेकिन यह टोकन को रीफ्रेश करते समय समस्याओं का समाधान नहीं करेगा, आदि। क्या फ़ायरबेस एसडीके के साथ वर्तमान Google एक्सेस टोकन प्राप्त करने का कोई तरीका है और यदि नहीं, तो समस्या के बिना समस्या के अन्य समाधान क्या हैं उपयोगकर्ता को दो बार प्रमाणीकृत करने के लिए?

अद्यतन 1:

someone else has struggled with similar problems with Facebook authentication तरह लगता है। उस प्रश्न पर link to the Firebase documentation था जिसमें कहा गया था कि फायरबेस प्रमाणीकरण अब तक पहुंच टोकन को जारी रखता है। तो मैं टोकन रीफ्रेश कैसे संभाल सकता हूं? क्या इसका कोई जवाब नहीं है?

अद्यतन 2:

तो, मैं इस समस्या के बारे में सुविधा का अनुरोध के साथ Firebase समर्थन से संपर्क किया और वे मेरा पीछा कर जवाब दिया:

अपने हमें लिखने का समय निकालने के लिए धन्यवाद।

मुझे आपका बिंदु यहां मिला है, यह वास्तव में एक अच्छा सुझाव है। हम निश्चित रूप से जानते हैं कि आपके जैसे कई उपयोगकर्ता, ओथ फीचर पसंद करेंगे जो रीफ्रेश पर टोकन तक पहुंच जाएगा। हम संभावित समाधानों की खोज कर रहे हैं, लेकिन मैं गारंटी नहीं दे सकता कि यह जल्द ही उपलब्ध होगा या नहीं। यद्यपि आगे बढ़ते हुए हम आपकी प्रतिक्रिया को ध्यान में रखेंगे। हमारे समुदाय के लिए निरंतर सुधार बहुत महत्वपूर्ण है, इसलिए इसे लाने के लिए धन्यवाद!

किसी भी अन्य अपडेट के लिए हमारे रिलीज नोट्स पर नजर रखें।

तो ऐसा लगता है कि इस समय फायरबेस एसडीके के माध्यम से एक्सेस टोकन उपलब्ध नहीं हैं। मैं अभी भी एक कामकाज खोजने की कोशिश कर रहा हूं, इसलिए अगर किसी के पास वैध समाधान के बारे में विचार हैं तो मुझे उन्हें सुनकर खुशी होगी। और निश्चित रूप से, अगर मैं कभी भी एक समाधान समाधान ढूंढता हूं तो मैं इसे यहां पोस्ट कर दूंगा।

+1

मेरा मानना ​​है कि विवरण वर्तमान उपयोगकर्ता ऑब्जेक्ट में जोड़ा जाना चाहिए, क्या आपने वर्तमान उपयोगकर्ता ऑब्जेक्ट में मौजूद चीज़ों की जांच करने का प्रयास किया है? 'firebase.auth()। वर्तमान उपयोगकर्ता; 'https://firebase.google.com/docs/auth/web/manage-users –

+0

हां, लेकिन मुझे वहां से Google टोकन नहीं मिल रहे हैं। मैंने getToken() फ़ंक्शन का भी प्रयास किया है, लेकिन फायरबेस जेडब्ल्यूटी टोकन का उपयोग Google एपीआई के साथ नहीं किया जा सकता है। – RoniPa

+0

यह भी देखें https://stackoverflow.com/questions/49182671/is-it-possible-to-add-events-to-a-users-google-calendar-via-firebase-server-sid/49183647#49183647 – Kato

उत्तर

4

अंततः Google APIs जावास्क्रिप्ट क्लाइंट के साथ फ़ायरबेस के बाहर प्रमाणीकरण को संभालने के द्वारा मुझे इस समस्या के आसपास मिल गया। इस समाधान के लिए Google auth क्लाइंट को documented here के रूप में शामिल करना आवश्यक है। फायरबेस साइन-इन प्रवाह को मैन्युअल रूप से संभालना here दस्तावेज किया गया है।

gapi.auth2.getAuthInstance().signIn() 
    .then(function _firebaseSignIn(googleUser) { 
     var unsubscribe = firebase.auth().onAuthStateChanged(function(firebaseUser) { 
     unsubscribe(); 
     // Check if we are already signed-in Firebase with the correct user. 
     if (!_isUserEqual(googleUser, firebaseUser)) { 
      // Build Firebase credential with the Google ID token. 
      var credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.getAuthResponse().id_token); 

      // Sign in with credential from the Google user. 
      return firebase.auth().signInWithCredential(credential) 
      .then(function(result) { 
       // other stuff... 
      }); 

_isUserEqual समारोह:

function _isUserEqual(googleUser, firebaseUser) { 
    if (firebaseUser) { 
    var providerData = firebaseUser.providerData; 
    for (var i = 0; i < providerData.length; i++) { 
     if (providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID && 
     providerData[i].uid === googleUser.getBasicProfile().getId()) { 
     // We don't need to reauth the Firebase connection. 
     return true; 
     } 
    } 
    } 
    return false; 
} 

अब मैं इस तरह पहुँच टोकन देख सकते हैं:

यह अभी भी मेरे लिए आदर्श समाधान नहीं है, लेकिन यह काम करता है के लिए अब, और मैं फायरबेस और कैलेंडर एपीआई दोनों को प्रमाणीकृत करने में सक्षम हूं।

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