Я использую api узла firebase в своих файлах javascript для входа в Google.

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

Это работает нормально, и пользователь может войти в систему со своими учетными данными Google. Когда пользователь снова посещает страницу, всплывающее окно открывается снова, но, поскольку он уже вошел в систему, всплывающее окно закрывается, не требуя какого-либо взаимодействия со стороны пользователя. Есть ли способ проверить, есть ли уже вошедший в систему пользователь, прежде чем запрашивать всплывающее окно?

Ответы (10)

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

Сначала импортируйте следующие

import Firebase
import FirebaseAuth

Затем

    // Check if logged in
    if (Auth.auth().currentUser != null) {
      // User is logged in   
    }else{
      // User is not logged in
    }

Другой способ - использовать то же, что использует firebase.

Например, когда пользователь входит в систему, firebase сохраняет указанные ниже данные в локальном хранилище. Когда пользователь возвращается на страницу, firebase использует тот же метод, чтобы определить, должен ли пользователь входить в систему автоматически.

enter image description here

ВНИМАНИЕ: это не указано и не рекомендовано firebase. Вы можете назвать этот метод неофициальным способом сделать это. Это означает, что позже, если firebase изменит свою внутреннюю работу, этот метод может не работать. Или короче. Используйте на свой риск! :)

Это невозможно определить, будет ли пользователь подписан, когда страница начинает загружаться, однако есть обходной путь.

Вы можете запомнить последнее состояние аутентификации в localStorage, чтобы сохранить его между сеансами и между вкладками.

Затем, когда страница начинает загружаться, вы можете оптимистично предположить, что пользователь будет повторно авторизован автоматически, и отложить диалог до тех пор, пока вы не будете уверены (т.е. после срабатывания onAuthStateChanged). В противном случае, если ключ localStorage пуст, вы можете сразу показать диалоговое окно.

Событие firebase 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()
  }
})



Реагироватьреактивный маршрутизаторcomponentDidMountPrivateRoutes


  
    
...

А вот так реализован мой PrivateRoute:

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

    // Using router Redirect instead of location.replace
    // 

Если вы разрешаете анонимным пользователям, а также тем, кто вошел в систему по электронной почте, вы можете использовать firebase.auth (). CurrentUser.isAnonymous, который вернет либо true, или * 100006. * ложь.

используйте Firebase.getAuth (). Он возвращает текущее состояние клиента Firebase. В противном случае возвращаемое значение будет nullВот документы: https://www.firebase.com/docs/web/api/firebase/getauth.html

Это работает:

асинхронная функция IsLoggedIn (): Promise  {
  пытаться {
    ждать нового обещания ((разрешить, отклонить) =>
      app.auth (). onAuthStateChanged (
        user => {
          if (user) {
            // Пользователь вошел в систему.
            решить (пользователь)
          } еще {
            // Ни один пользователь не вошел в систему.
            отклонить ('ни один пользователь не вошел в систему')
          }
        },
        // Предотвращаем ошибку консоли
        error => reject (ошибка)
      )
    )
    вернуть истину
  } catch (ошибка) {
    вернуть ложь
  }
}

Технически существует 3 возможности с обещаниями:

// 1) лучший вариант, так как он ждет пользователя ...

const isLoggedIn: any = ожидание нового обещания ((разрешение: любое, отклонение: любое) =>
this.afa.onAuthStateChanged ((пользователь: любой) =>
  resolve (пользователь), (e: any) => reject (e)));

console.log (isLoggedIn);

// 2) могут возникнуть проблемы с выходом из системы ...

const isLoggedIn2 = ждать this.afa.authState.pipe (first ()). toPromise ();

console.log (isLoggedIn2);

// 3) технически есть 3-я опция 'unknown' перед загрузкой пользователя ...

const isLoggedIn3 = ждать this.afa.currentUser;

console.log (isLoggedIn3);


// затем сделаем что-нибудь вроде (в зависимости от ваших потребностей) с 1, 2 или 3:

if (!! isLoggedIn) {
  // авторизовался
}

Также обратите внимание, что это угловой пример, но вы можете заменить this.afa на firebase.auth ()

Вы также можете проверить, есть ли currentUser

var user = firebase.auth().currentUser;

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

В этом сценарии нет необходимости использовать функцию onAuthStateChanged ().

Вы можете легко определить, вошел ли пользователь в систему или нет, выполнив:

var user = firebase.auth().currentUser;

Для тех, кто сталкивается с проблемой «возврата нуля», это просто потому, что вы не ждете завершения вызова firebase.

Предположим, вы выполняете действие входа в систему на странице 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, если нет, то будет просто «null»

И это все, что вам нужно.

С уважением

2022 WebDevInsider