簡體   English   中英

Firebase - 重定向到不同頁面時保持用戶登錄

[英]Firebase - Keep user signed in when redirecting to different page

我的網站有 2 個組件:

  1. 帶有注冊表單的登錄頁面 ( https://example.com )

  2. 單頁 anuglarjs 應用程序 ( https://app.example.com )

我想要實現的是,當用戶來到登陸頁面時,他們能夠使用 Firebase 進行注冊,一旦注冊完成,將用戶重定向到單頁應用程序並自動登錄,這樣他們就不會'不必再次輸入他們的信息。

這是我的登陸頁面注冊代碼:

處理注冊按鈕按下

$('.signUpBtn').click(function() {
        let name = $('#firstName').val();
        let email = $('#clientEmail').val();
        let pw = $('#clientPw').val();
        if (name != "" && email != "" && pw != "") {
            if (pw.length > 7) {
                firebase.auth().createUserWithEmailAndPassword(email, pw)
                    .then(function(user) {
                        ga('send', 'event', 'New account via landing page', 'created');
                        updateUser(name, email, true);
                        user.sendEmailVerification();
                    })
                    .catch(function(error) {
                        // Handle Errors here.
                        var errorCode = error.code;
                        var errorMessage = error.message;
                        showError(errorMessage);
                        console.log(errorMessage);
                        // ...
                    });
            } else {
                showError("Oops. The password must be at least 8 characters...");
            }
        } else {
            showError("Oops. The email, name, and password can not be empty...");
        }
    });

處理應該推送到用戶“個人資料”的信息:

    function updateUser(name, email, clicked) {
        firebase.auth().onAuthStateChanged(function(user) {
            if (user && name != "" && email != "" && name != undefined && email != undefined) {
               name = name.charAt(0).toUpperCase() + name.slice(1);
                user.updateProfile({
                    displayName: name
                  }).then(function() {
                    firebase.database().ref('users/' + user.uid + '/user/').update({
                          name: name,
                          email: email,
                          first_signin: new Date(),
                          email_verified: false,
                          email_reminders: true,
                          pts: 0,
                          first_visit: true
                      }).then((snap) => {
                          console.log(snap)
                          window.location = 'https://app.example.com';
                      });
                  });
            } else {

            }
        });
    }

相當基本的 Firebase 東西......

這是我用於處理用戶身份驗證的app.example.com單頁 angularjs 應用程序的代碼:

firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
           //show their data
      } else {
           //show login component
      }
});

再次,非常簡單的東西。

我遇到的問題是,當它重定向用戶時,並沒有讓他們登錄。它顯示了登錄組件,如果你輸入剛剛注冊的憑據,它完全可以工作,但我想要用戶在點擊頁面后立即登錄。

有什么我想念的嗎? 據我所知,它應該有效..

有任何想法嗎? 謝謝你。

Firebase Auth會話是單個主機來源。 它們通過localStorage / indexedDB持久化。 (他們確實提供會話並且也沒有持久性: https : //firebase.google.com/docs/auth/web/auth-state-persistence

這就是為什么您無法在其他子域中訪問身份驗證狀態的原因。 您正在https://example.com上登錄,然后導航到https://app.example.com ,但是auth狀態僅在前者中保持不變。

我認為這是可能的:

firebase.auth().signInWithCustomToken(token)
  .then((userCredential) => {
    // Signed in
    var user = userCredential.user;
    // ...
  })
  .catch((error) => {
    var errorCode = error.code;
    var errorMessage = error.message;
    // ...
  });

但是之前需要生成一個token。 我不是 Firebase 專家。 有人可以糾正我嗎?

來源: https : //firebase.google.com/docs/auth/admin/create-custom-tokens#web

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM