Bir kullanıcının Firebase'de zaten oturum açmış olup olmadığını nasıl anlarım?


110

Google girişi için javascript dosyalarımda firebase düğüm api'sini kullanıyorum.

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

Bu iyi çalışıyor ve kullanıcı Google kimlik bilgileriyle giriş yapabiliyor. Kullanıcı sayfayı tekrar ziyaret ettiğinde, pop-up tekrar açılır, ancak daha önce oturum açtığı için, kullanıcının herhangi bir etkileşime girmesine gerek kalmadan açılır pencere kapanır. Açılır pencereyi sormadan önce oturum açmış bir kullanıcının olup olmadığını kontrol etmenin bir yolu var mı?

Yanıtlar:


124

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

Bir kimlik doğrulama durumu değişiklik gözlemcisi eklemelisiniz.

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

3
Bu benim için tutarsız. stackoverflow.com/questions/39395158/…
Dan P.

2
OnAuthStateChanged kullanarak, bir kullanıcının yeni olup olmadığını anlamanın bir yolu var mı?
Brennan

1
Evet, ama tam olarak değil onAuthStateChanged. Bu, 4.6.0'da eklenmiştir: firebase.google.com/support/release-notes/js#4.6.0 Bunu oturum açma yönteminden veya currentUser.metadata(son oturum açma zamanı ve oluşturma zamanı) adresinden edinebilirsiniz ...
bojeil

1
@bojeil Sanırım bu yöntemin bir uyarısı var. Bu kodu bir sayfaya koyabilirsiniz ve o sayfada olmasanız bile tetiklenir. AuthState değiştiğinde tetiklenir. Diğer sayfalarda değişirse, istemediğinizde etkin bir şekilde tetiklenmesini sağlarsınız. En azından şu anda bana olan bu.
thevengefulco

1
Bu, diğer sekmelerdeki oturum açma olaylarını algılayacaktır. İstendiği gibi çalışıyor. Firebase Auth, oturum açma etkinliklerini pencereler arasında yayar.
bojeil

86

Bir varsa da kontrol edebilirsiniz CurrentUser

var user = firebase.auth().currentUser;

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

10
Bu, hemen oturum açtıktan sonra bile benim için boş döndürüyor.
Aarmora

9
Bu garip, benim için işe yarıyor, belki de sorun, kimlik doğrulamasının eşzamansız olması ve _ currentUser_'ın henüz güncellenmemiş olmasıdır.
Daniel Passos

1
Dokümanlardan: currentUser, auth nesnesi başlatmayı bitirmediği için de boş olabilir. Kullanıcının oturum açma durumunu takip etmek için bir gözlemci kullanıyorsanız, bu vakayı halletmeniz gerekmez.
cheshireoctopus

Ona güvenemezsin. Resmi belgelere bakın: "getCurrentUser'ın boş olmayan bir değer döndürdüğü bazı durumlar vardır ..."
Andrew

Boş alıyorsanız, bunun nedeni muhtemelen henüz başlatılmamış olmasıdır.
Arnaldo Capo

31

Öyle mümkün değildir , bir kullanıcı olup olmadığını söylemek için olacak bir çalışma etrafında olsa, orada bir sayfa yükleme başladığında imzalanacak.

Şunları yapabilirsiniz geçen yetkilendirme durumunu ezberlemek oturumları arasında ve sekmeler arasında bunu devam etmek localStorage için.

Ardından, sayfa yüklenmeye başladığında, iyimser bir şekilde kullanıcının otomatik olarak yeniden oturum açacağını varsayabilir ve emin oluncaya kadar iletişim kutusunu erteleyebilirsiniz (yani onAuthStateChangedyangınlardan sonra ). Aksi takdirde, localStorageanahtar boşsa, iletişim kutusunu hemen gösterebilirsiniz.

Firebase onAuthStateChangedolayı, bir sayfa yüklendikten yaklaşık 2 saniye sonra tetiklenir .

// 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()
  }
})



Bunu React ve react-router ile kullanıyorum . Yukarıdaki kodu componentDidMountUygulama kök bileşenimin içine koydum . Orada, renderda biraz varPrivateRoutes

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

Ve PrivateRoute şu şekilde uygulanır:

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}}}
    // />

Bana bu konuda yardım edebileceğini düşünüyor musun? Cevabınızın üst kısmındaki otomatik giriş yönlendirmesini denedim ve şimdi kaldıramıyorum. Yerel depolama alanımı tamamen temizledim ve sürekli yeniden yönlendirmeler nedeniyle oturumu kapatılan firebase siteme hala erişemiyorum.
hego64

@ hego64 Firebase uygulamanızdan gerçekten çıkış yaptınız mı? Bu çözüm oturum açma işlemini gerçekleştirmez. Yalnızca kullanıcı önceki oturumda oturumu kapatmamışsa oturum açma formunun atlanmasına izin verir. / EDIT: Yönlendirme döngüsünde misiniz? Cevabı güncelleyeceğim.
Qwerty

Evet, daha net olmalıydım, bir yönlendirme döngüsünde sıkışmıştım. Oturumu kapatırdım ve uygulamaya geri dönmek yerine doğrudan oturum açma sayfasına geri götürüldüm. Önceki bir dağıtıma geri dönerek düzeltmeyi başardım, ancak bunun dışında sorunu düzeltmek için ne yapmam gerektiğinden emin değildim.
hego64

1
@ hego64 Oturum açmamış kullanıcılar her gün serbestçe dolaşamamalıdır, bu nedenle oturum açma sayfasına yeniden yönlendirme doğrudur, ancak kimlik doğrulama olmadan kullanılabilen yollar varsa, mantığı yönlendiriciye taşımanız gerekir veya bunun yerine, benim PrivateRoute sarmalayıcı örneğimdeki gibi belirli yollar. Dolayısıyla, kullanıcı kısıtlanmış bir sayfadaysa ve çıkış yaparsa, oturum açma sayfasına yönlendirilecektir. Diğer rotalarınızda bu mantık uygulanmayacaktır.
Qwerty

Bu konuda bir süre takılıp kaldım ... bu yöntem oldukça iyi çalışıyor. Teşekkür ederim.
spetz83

20

Bu senaryoda onAuthStateChanged () işlevini kullanmaya gerek yoktur.

Aşağıdakileri yürüterek kullanıcının oturum açıp açmadığını kolayca tespit edebilirsiniz:

var user = firebase.auth().currentUser;

"Geri dönen" sorunla karşılaşanlar için, bunun nedeni firebase çağrısının tamamlanmasını beklememenizdir.

Diyelim ki Sayfa A'da oturum açma eylemini gerçekleştiriyorsunuz ve ardından Sayfa B'yi çağırıyorsunuz, Sayfa B'de beklenen davranışı test etmek için aşağıdaki JS kodunu çağırabilirsiniz:

  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);
    });

Kullanıcı oturum açtıysa, "var user" beklenen JSON yükünü içerecek, yoksa "boş" olacaktır.

Ve ihtiyacınız olan tek şey bu.

Saygılarımızla


3
@Mauricio Silvestre değil mi? firebase.auth.currentUserOturum açmış olsam da tanımlanmamış dönüşler kullanılıyor . Yalnızca auth () oturum açtığımda doğru sonucu döndürür.
Ürdün

6

Bir başka yol da firebase'in kullandığı şeyin aynısını kullanmaktır.

Örneğin, kullanıcı oturum açtığında, firebase aşağıdaki ayrıntıları yerel depolama alanında depolar. Kullanıcı sayfaya geri döndüğünde firebase, kullanıcının otomatik olarak oturum açması gerekip gerekmediğini belirlemek için aynı yöntemi kullanır.

görüntü açıklamasını buraya girin

ATTN: Bu, firebase tarafından listelenmediği veya önerilmediği için. Bu yöntemi resmi olmayan bir yöntem olarak adlandırabilirsiniz. Bu, daha sonra firebase'in kendi iç işleyişini değiştirmesi durumunda bu yöntemin çalışmayabileceği anlamına gelir. Ya da kısaca. Kendi sorumluluğunuzdadır kullanın! :)


5

Bu çalışıyor:

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

2

Anonim kullanıcıların yanı sıra e-posta ile oturum açmış olanlara izin veriyorsanız, kullanabilirsiniz firebase.auth().currentUser.isAnonymous, bu ya trueveya false.



-4

Önce aşağıdakileri içe aktarın

import Firebase
import FirebaseAuth

Sonra

    // Check if logged in
    if (Auth.auth().currentUser != null) {
      // User is logged in   
    }else{
      // User is not logged in
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.