2017-04-19 22 views
8

का उपयोग करते समय नए उपयोगकर्ता साइन इन पर पृष्ठ रीफ्रेश करें, मैं Google Sign For Websites. का उपयोग कर वेबसाइट बनाने की कोशिश कर रहा हूं, ज्यादातर यह सीखने के लिए कि यह कैसे काम करता है।Google oAuth 2.0

मैंने उस ट्यूटोरियल में उल्लिखित चरणों का पालन किया है जो Google प्रदान करता है जो ठीक काम करता है। उपयोगकर्ता मेरी साइट पर सफलतापूर्वक साइन इन कर सकते हैं, यह उपयोगकर्ता आईडी को बैकएंड में पास करने में सक्षम है और फिर एक PHP स्क्रिप्ट का उपयोग कर आईडी सर्वर पक्ष को सत्यापित कर सकता है।

PHP फिर वेबसाइट पर उपयोगकर्ता के लिए एक सत्र बनाता है। मैं यह नहीं समझ सकता कि जब कोई उपयोगकर्ता Google साइन इन बटन पर क्लिक करता है और साइन इन सफल होता है तो मैं पृष्ठ को रीफ्रेश कैसे करूं। पृष्ठ को रीफ्रेश करने से होम पेज को नए PHP सत्र डेटा के साथ पुनः लोड करने की अनुमति मिल जाएगी।

<div class="g-signin2 signin-button" data-onsuccess="onSignIn" data-theme="dark"></div> 

function onSignIn(googleUser){ 

     // The ID token you need to pass to your backend: 
     var id_token = googleUser.getAuthResponse().id_token; 

     var xhr = new XMLHttpRequest(); 
     xhr.open('POST', 'https://mywebsite.com/tokensignin.php'); 
     xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
     xhr.onload = function() { 
      console.log('Signed in as: ' + xhr.responseText); 
     }; 
     xhr.send('idtoken=' + id_token); 
     }; 

मैं कोड के ऑनलोड = function() भाग के अंदर बस location.reload() का उपयोग कर की कोशिश की है। यह पृष्ठ अभी infinately हर बार यह फिर भी भरी हुई है के बाद से गूगल verifys कि उपयोगकर्ता इस xhr चर के माध्यम से में हर बार प्रवेश किया गया है ताज़ा करने के लिए कारण बनता है।

मैंने looking through their reference का उपयोग किसी भी बदलाव की निगरानी के लिए GoogleAuth.isSignedIn.listen(listener) का उपयोग करने के लिए किया है, लेकिन ऐसा लगता है कि मैं इसे पूरा नहीं कर रहा हूं या मैं इसे सही तरीके से उपयोग नहीं कर रहा हूं क्योंकि मुझे नहीं पता कि श्रोता क्या होना चाहिए।

अन्य विकल्प उनके GoogleAuth.attachClickHandler(container, options, onsuccess, onfailure) फ़ंक्शन का उपयोग हो सकता है, लेकिन मैं पूरी तरह से यकीन है कि कैसे ठीक विकल्प क्षेत्र/चर कॉन्फ़िगर नहीं कर रहा हूँ।

अगर कोई इस दुनिया को कैसे काम करता है, इस बारे में कुछ अंतर्दृष्टि प्रदान कर सकता है तो मैं इसकी सराहना करता हूं।

सारांश के लिए यदि उपयोगकर्ता पहले से ही Google का उपयोग कर मेरी वेबसाइट पर साइन इन है, तो मैं पृष्ठ को कुछ भी नहीं करना चाहता, अगर वे साइनइन बटन पर क्लिक करते हैं, तो साइन इन सफल होने के बाद, मैं उस पेज को रीफ्रेश करना चाहता हूं, जिस पर वे हैं।

उत्तर

2

आप कॉलबैक फ़ंक्शन के साथ xhr में श्रोता जोड़ सकते हैं।

xhr.addEventListener("load", loginComplete); 

और फिर एक समारोह बनाने के लिए:

function loginComplete(evt) { 
    console.log("Login Complete"); 
    window.location.reload(); 
} 

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

ठीक है। चूंकि श्रोता मदद नहीं करता है। आपको यह जांचने की आवश्यकता होगी कि उपयोगकर्ता पहले से लॉग इन है या नहीं। उस जानकारी को सहेजने के लिए मैं सोच सकता हूं कि कुकीज़ का उपयोग करना होगा।

तो तुम प्रमाणीकरण टोकन Google से मिलने की दुकान है और इसके लिए एक कुकी सेट और हर जाँच से पहले आप अपनी पोस्ट कर सकता है। https://github.com/js-cookie/js-cookie

तो फिर तुम आईडी बचाने ऑनलोड:

xhr.onload = function() { 
    Cookie.set('google_token', id_token); 
    window.location.reload(); 
}; 

और onSignIn समारोह होगा की तरह:

function onSignIn(googleUser){ 
    var cookie = Cookie.get('google_token'); 
    if(cookie != undefined){ 
     //cookie is set 
     return; 
    } 
    ... 
    //rest of the function 
} 
बेशक

आप की जरूरत

यहाँ एक अच्छा js कुकी पुस्तकालय है उदाहरण के लिए इस कोड में सुधार करने के, तो देखें कि टोकन कुकी में संगृहीत अभी भी मान्य है, कुछ मामलों आप इसे बजाय (oAut फिर में उपयोगकर्ता लॉग बनाने की ताज़ा कर सकते हैं एच एपीआई ऐसी चीजें प्रदान करता है)।

.. कुछ सुरक्षा उपायों सुनिश्चित करने के लिए सुनिश्चित टोकन इंजेक्शन नहीं किया जा रहा है और आदि

+0

यह अभी भी समस्या का समाधान नहीं करता है क्योंकि यह अभी भी पेज रीफ्रेश के अनंत लूप बनाता है। जब बटन क्लिक किया जाता है तो यह रीफ्रेश ट्रिगर करेगा और लॉगिन समाप्त हो जाएगा। हालांकि एक बार ताज़ा करने के बाद पेज लोड समाप्त हो जाता है तो यह अनुरोध फिर से भेजता है। चूंकि पेज लोड होने पर हर बार Google यह लॉगिन करता है कि उपयोगकर्ता अभी भी साइट पर साइन इन है या नहीं। अगर वे साइट पर साइन इन हैं तो लॉगिन सफलतापूर्वक पूरा हो जाता है। जिसके बाद लॉगिन फिर से 'पूरा' हो जाता है। – Jem

+0

@New_Wav क्या आप मेरा संपादन देख सकते हैं? –

+0

जब मैं अगले दिन या दो में समय लेता हूं तो मैं इसे आज़मा दूंगा। मुझे लगता है कि यह संभवतः सबसे विश्वसनीय विधि बन जाएगा। मैंने पिछले दिन या तो एपीआई के साथ कुछ अतिरिक्त प्रयोग किया है। ऐसे कुछ फ़ंक्शन हैं जो GoogleAuth.isSignedIn.listen जैसे उपयोगकर्ता स्थिति में परिवर्तन की तलाश करते हैं लेकिन उनमें से कुछ मौजूदा समस्याओं में से कुछ हैं। प्रत्येक बार पृष्ठ लोड होने पर राज्य परिवर्तन की सुनवाई की जाती है, फिर से ताज़ा करने के अनंत लूप को बनाते हैं। डेटा को सत्यापित करने के लिए सत्रों के साथ जोड़ा गया एक नया बनाम पहले से साइन इन करने के लिए एक कुकी, – Jem

0

क्यों अपनी पीठ अंत रीडायरेक्ट है (या पेज इतनी जानकारी भेजने तो यह सफलता पर रीडायरेक्ट कर सकते हैं) नहीं?

लॉगिन स्क्रीन को पुनः लोड करने की आवश्यकता क्या है?

आप श्रोता दस्तावेज को भी देख सकते हैं जैसे ऐसा लगता है कि आप जो चाहते हैं उसे हल कर सकते हैं। अर्थात। उपयोगकर्ता परिवर्तन के लिए सुनो और एक समारोह या पुनर्निर्देशित ट्रिगर।

https://developers.google.com/identity/sign-in/web/listeners

1

मेरे दृष्टिकोण तुम्हारा के रूप में ही था और मैं वास्तव में लगातार ताज़ा के साथ एक ही समस्या में पड़ गए।

मैं समाधान के एक जोड़े की कोशिश की, सबसे अच्छा काम कर एक प्रकार थी:

ट्रिगर कॉलबैक GAPI2 का उपयोग करने में
  • उपयोगकर्ता संकेत onGoogleSignIn
  • बैकएंड आईडी टोकन वैधता, और संकेत उपयोगकर्ता की जाँच करता है पर सत्र के माध्यम से में मेरे webapp
  • सफल होने पर, मैं, लॉग उपयोगकर्ता बाहर GAPI2 का उपयोग कर, अनंत पुनः लोड रोकने क्योंकि onGoogleSignIn फिर कभी नहीं
  • तब कहा जाता है मैं पेज और replac ताज़ा ई मेरे वेबएप

यह समाधान निश्चित रूप से बहुत बेकार है यदि आप उपयोगकर्ता के Google खाते पर कुछ डेटा कुशल बनाना चाहते हैं, लेकिन मुझे इस कार्यक्षमता के लिए कोई उपयोग नहीं मिला है।


किसी को अपने Google खाते से साइन आउट करने के लिए कोड।

function signOut() { 
    var auth2 = gapi.auth2.getAuthInstance(); 
    auth2.signOut().then(function() { 
     console.log('User signed out.'); 
    }); 
} 
संबंधित मुद्दे