यदि कोई उपयोगकर्ता पहले से ही Firebase में लॉग इन है तो मुझे कैसे पता चलेगा?


102

मैं Google लॉगिन के लिए अपनी जावास्क्रिप्ट फ़ाइलों में फायरबेस नोड एपीआई का उपयोग कर रहा हूं।

firebase.initializeApp(config);
let provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider);

यह ठीक काम करता है और उपयोगकर्ता अपने Google क्रेडेंशियल्स के साथ लॉगिन करने में सक्षम है। जब उपयोगकर्ता पृष्ठ पर फिर से आता है, तो पॉपअप फिर से खुलता है लेकिन जब से वह पहले ही लॉग इन कर चुका होता है, तो पॉपअप उपयोगकर्ता से किसी भी इंटरैक्शन की आवश्यकता के बिना बंद हो जाता है। क्या पॉपअप को प्रॉम्प्ट करने से पहले उपयोगकर्ता में पहले से ही लॉग इन है या नहीं, इसकी जांच करने का कोई तरीका है?

जवाबों:


113

https://firebase.google.com/docs/auth/web/manage-users

आपको एक स्थिति स्थिति पर्यवेक्षक जोड़ना होगा।

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
  } else {
    // No user is signed in.
  }
});

3
यह मेरे लिए असंगत है। stackoverflow.com/questions/39395158/…
Dan P.

2
OnAuthStateChanged का उपयोग करना, क्या यह बताने का कोई तरीका है कि कोई उपयोगकर्ता नया है?
ब्रेनन

हाँ, लेकिन के माध्यम से नहीं onAuthStateChanged। इसे 4.6.0 में जोड़ा गया था: firebase.google.com/support/release-notes/js#4.6.0 आप इसे साइन-इन विधि से या currentUser.metadata(अंतिम समय और निर्माण समय में साइन इन) से प्राप्त कर सकते हैं ...
bojeil

@bojeil मुझे लगता है कि इस विधि के लिए एक चेतावनी है। आप इस कोड को एक पृष्ठ पर रख सकते हैं, और यह तब भी ट्रिगर होगा जब आप उस पृष्ठ पर नहीं होंगे। यह तब होता है जब AuthState बदलता है। यदि यह अन्य पृष्ठों पर बदलता है, तो जब आप इसे नहीं चाहते हैं तो आपके पास प्रभावी रूप से ट्रिगर होगा। कम से कम, कि अभी मेरे साथ क्या हो रहा है।
thevengefulco

1
यह अन्य टैब पर घटनाओं में साइन का पता लगाएगा। यह इच्छानुसार काम करता है। फायरबेस ऑथर विंडोज़ की घटनाओं में साइन का प्रचार करता है।
bojeil

82

यदि कोई करंट है तो आप भी देख सकते हैं

var user = firebase.auth().currentUser;

if (user) {
  // User is signed in.
} else {
  // No user is signed in.
}

8
यह तत्काल लॉगिन के बाद भी मेरे लिए अशक्त लौट रहा है।
अनमोरा

8
यह अजीब है, यह मेरे लिए काम करता है, शायद समस्या इसलिए है क्योंकि ऑर्टिक असेंबल है और _ currentUser_ अभी तक अपडेट नहीं किया गया था।
डैनियल पासोस

1
डॉक्स से: करेंटयूजर भी अशक्त हो सकता है क्योंकि ऑर्टिक ऑब्जेक्ट ने इनिशियलाइज़िंग खत्म नहीं किया है। यदि आप उपयोगकर्ता के साइन-इन स्थिति का ट्रैक रखने के लिए एक पर्यवेक्षक का उपयोग करते हैं, तो आपको इस मामले को संभालने की आवश्यकता नहीं है।
चेशायरोक्टोपस

आप इस पर भरोसा नहीं कर सकते। आधिकारिक डॉक्स देखें: "कुछ मामले हैं जहां getCurrentUser एक गैर-शून्य लौटाएगा ..."
एंड्रयू

यदि आप अशक्त हो रहे हैं, तो शायद यह इसलिए है क्योंकि यह अभी तक इनिशियलाइज़ नहीं हुआ है।
अर्नाल्टो कैपो

28

यह बताना संभव नहीं है कि किसी पेज को लोड करना शुरू करने पर उपयोगकर्ता पर हस्ताक्षर किए जाएंगे या नहीं , हालांकि इसके आसपास कोई काम है।

आप सत्रों के बीच और टैब के बीच इसे बनाए रखने के लिए स्थानीयस्टोरेज में अंतिम स्थिति को याद कर सकते हैं।

फिर, जब पृष्ठ लोड होना शुरू होता है, तो आप आशावादी रूप से मान सकते हैं कि उपयोगकर्ता स्वचालित रूप से फिर से साइन इन किया जाएगा और संवाद को स्थगित कर देगा जब तक कि आप सुनिश्चित नहीं हो सकते (यानी onAuthStateChangedआग के बाद )। अन्यथा, यदि localStorageकुंजी खाली है, तो आप तुरंत संवाद दिखा सकते हैं।

पेज लोड होने के बाद फायरबेस onAuthStateChangedइवेंट लगभग 2 सेकंड फायर करेगा ।

// User signed out in previous session, show dialog immediately because there will be no auto-login
if (!localStorage.getItem('myPage.expectSignIn')) showDialog() // or redirect to sign-in page

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    // User just signed in, we should not display dialog next time because of firebase auto-login
    localStorage.setItem('myPage.expectSignIn', '1')
  } else {
    // User just signed-out or auto-login failed, we will show sign-in form immediately the next time he loads the page
    localStorage.removeItem('myPage.expectSignIn')

    // Here implement logic to trigger the login dialog or redirect to sign-in page, if necessary. Don't redirect if dialog is already visible.
    // e.g. showDialog()
  }
})



मैं रिएक्ट और प्रतिक्रिया-राउटर के साथ इसका उपयोग कर रहा हूं । मैंने componentDidMountअपने ऐप रूट घटक में ऊपर कोड डाला । वहाँ, रेंडर में, मेरे पास कुछ हैPrivateRoutes

<Router>
  <Switch>
    <PrivateRoute
      exact path={routes.DASHBOARD}
      component={pages.Dashboard}
    />
...

और यह मेरे निजीकरण को कैसे लागू किया जाता है:

export default function PrivateRoute(props) {
  return firebase.auth().currentUser != null
    ? <Route {...props}/>
    : localStorage.getItem('myPage.expectSignIn')
      // if user is expected to sign in automatically, display Spinner, otherwise redirect to login page.
      ? <Spinner centered size={400}/>
      : (
        <>
          Redirecting to sign in page.
          { location.replace(`/login?from=${props.path}`) }
        </>
      )
}

    // Using router Redirect instead of location.replace
    // <Redirect
    //   from={props.path}
    //   to={{pathname: routes.SIGN_IN, state: {from: props.path}}}
    // />

क्या आपको लगता है कि आप इसमें मेरी मदद कर सकते हैं? मैंने आपके उत्तर के शीर्ष पर ऑटो-लॉगिन रीडायरेक्ट की कोशिश की, और अब मैं इसे हटा नहीं सकता। मैंने अपना स्थानीय संग्रहण पूरी तरह से साफ़ कर दिया है और मैं अभी भी अपने रीडायरेक्ट साइट को लगातार रीडायरेक्ट के कारण लॉग आउट नहीं कर सकता।
हेगियो ६४

@ hego64 क्या आपने वास्तव में अपने फायरबेस ऐप से लॉग आउट किया है? यह समाधान लॉग-इन नहीं करता है। यह केवल साइन-इन फ़ॉर्म को छोड़ने की अनुमति देता है यदि उपयोगकर्ता पिछले सत्र में साइन आउट नहीं किया था। / संपादित करें: क्या आप अनुप्रेषित लूप में हैं? मैं जवाब अपडेट कर दूंगा।
क्वर्टी

हां, मुझे अधिक स्पष्ट होना चाहिए था, मैं एक अनुप्रेषित लूप में फंस गया था। मैं लॉग आउट करूंगा, और ऐप पर वापस जाने के बजाय, मुझे सीधे साइन-इन पृष्ठ पर ले जाया गया। मैं इसे पिछली तैनाती में वापस लाकर इसे ठीक करने में सक्षम था, लेकिन इस तरफ से मुझे यकीन नहीं था कि इस मुद्दे को ठीक करने के लिए क्या करना चाहिए।
Hego64

1
@ hego64 उपयोगकर्ता जो साइन-इन नहीं हैं, वे आज़ादी से घूमने में सक्षम नहीं हो सकते हैं, इसलिए लॉग-इन पृष्ठ पर पुनर्निर्देशन सही है, लेकिन यदि ऐसे मार्ग हैं जो प्रमाणीकरण के बिना उपलब्ध हैं, तो आपको तर्क को राउटर में ले जाना चाहिए या इसके बजाय विशेष मार्गों, मेरे PrivateRoute आवरण उदाहरण में बहुत पसंद है। इसलिए यदि उपयोगकर्ता प्रतिबंधित पृष्ठ पर है और साइन आउट करता है, तो उन्हें लॉग-इन पृष्ठ पर पुनः निर्देशित किया जाएगा। आपके अन्य मार्गों पर यह तर्क लागू नहीं होगा।
क्वर्टी

मैं इस पर थोड़ा अटक गया था ... यह तरीका बहुत अच्छा काम करता है। धन्यवाद।
spetz83

17

इस परिदृश्य में onAuthStateChanged () फ़ंक्शन का उपयोग करने की कोई आवश्यकता नहीं है।

आप आसानी से पता लगा सकते हैं कि उपयोगकर्ता लॉग-इन कर रहा है या नहीं।

var user = firebase.auth().currentUser;

उन लोगों के लिए जो "रिटर्निंग नल" मुद्दे का सामना करते हैं, यह सिर्फ इसलिए है क्योंकि आप फायरबेस कॉल पूरा होने का इंतजार नहीं कर रहे हैं।

मान लीजिए कि आप पृष्ठ A पर लॉगिन क्रिया करते हैं और फिर आप पृष्ठ B को लागू करते हैं, पृष्ठ B पर आप अपेक्षित व्यवहार का परीक्षण करने के लिए निम्नलिखित JS कोड को कॉल कर सकते हैं:

  var config = {
    apiKey: "....",
    authDomain: "...",
    databaseURL: "...",
    projectId: "..",
    storageBucket: "..",
    messagingSenderId: ".."
  };
  firebase.initializeApp(config);

    $( document ).ready(function() {
        console.log( "testing.." );
        var user = firebase.auth().currentUser;
        console.log(user);
    });

यदि उपयोगकर्ता लॉग इन है तो "var user" में अपेक्षित JSON पेलोड होगा, यदि नहीं, तो यह केवल "Jull" होगा

और बस इतना ही चाहिए।

सादर


3
@ मौरिसियो सिलवेस्टर है? firebase.auth.currentUserअपरिभाषित रिटर्न का उपयोग करते हुए कि क्या मैं साइन इन हूं या नहीं। केवल साइन इन होने पर ही सही () सही परिणाम देता है।
tsujp

5

एक और तरीका यह है कि फायरबेस जो उपयोग करता है उसी चीज का उपयोग करें।

उदाहरण के लिए, जब उपयोगकर्ता लॉग इन करता है, फायरबेस स्थानीय भंडारण में विवरण के नीचे संग्रहीत करता है। जब उपयोगकर्ता पृष्ठ पर वापस आता है, तो फायरबेस यह पता लगाने के लिए उसी विधि का उपयोग करता है कि क्या उपयोगकर्ता को स्वचालित रूप से लॉग इन किया जाना चाहिए।

यहां छवि विवरण दर्ज करें

ATTN: चूंकि यह न तो फायरबेस द्वारा सूचीबद्ध या अनुशंसित है। आप इस विधि को ऐसा करने का आधिकारिक तरीका कह सकते हैं। जिसका अर्थ है कि बाद में अगर फायरबेस अपने आंतरिक कामकाज को बदल देता है, तो यह विधि काम नहीं कर सकती है। या संक्षेप में। अपने जोखिम पार इस्तेमाल करें! :)


5

यह काम:

async function IsLoggedIn(): Promise<boolean> {
  try {
    await new Promise((resolve, reject) =>
      app.auth().onAuthStateChanged(
        user => {
          if (user) {
            // User is signed in.
            resolve(user)
          } else {
            // No user is signed in.
            reject('no user logged in')
          }
        },
        // Prevent console error
        error => reject(error)
      )
    )
    return true
  } catch (error) {
    return false
  }
}

1

यदि आप अनाम उपयोगकर्ताओं के साथ-साथ उन ईमेल के साथ लॉग इन कर रहे हैं firebase.auth().currentUser.isAnonymous, जिनका आप उपयोग कर सकते हैं , जो trueया तो वापस आ जाएंगे false



-3

पहले निम्नलिखित आयात करें

import Firebase
import FirebaseAuth

फिर

    // Check if logged in
    if (Auth.auth().currentUser != null) {
      // User is logged in   
    }else{
      // User is not logged in
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.