FirebaseとAngularに組み込まれたアプリケーションがあり、ページを更新した後もユーザーがログインしたままにできるようにしたいと思っています。現在、コントローラにバインドする2つの基本的な入力フィールドがあるログイン画面があります。
this.email = "";
this.pass = "";
this.emessage = "";
this.loginUser = function() {
ref.authWithPassword({
email: this.email,
password: this.pass
}, function(error, authData) {
if (error) {
console.log("Login Failed!", error);
this.emessage = error.message;
$scope.$apply();
} else {
dataStorage.uid = authData.uid;
$location.path('/projects');
$scope.$apply();
}
}.bind(this));
}
これはすべて問題なく、うまくいきますが、ユーザーがページを更新すると、ログアウトされます。コントローラが読み込まれたときに、ユーザーがすでにログインしていて自動リダイレクトされているかどうかを確認する方法はありますか?ありがとう!
現在使用しているコードは、ユーザーがログオンするケースを処理します。ユーザーが既にログインしている場合に対処するには、認証状態を監視します。 認証状態の監視に関するFirebaseドキュメント から:
// Create a callback which logs the current auth state
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.onAuth(function(authData) {
if (authData) {
console.log("User " + authData.uid + " is logged in with " + authData.provider);
} else {
console.log("User is logged out");
}
});
通常は、この関数のelse
にログオンボタンのみを表示します。
私のWebアプリには、保護された機能を備えたパブリックページがあるという課題があります。次のコードでは、ユーザーは常にFirebase SDKを介して読み込まれます(ログインしている場合)。ただし、ページで認証が必要な場合は、ログインページにもリダイレクトされます。これはページのリロードでうまく機能します。
Router.beforeEach((to, from, next) => {
// If route required authentication
if (to.matched.some(record => record.meta.requiresAuth)) {
// Load user
firebase.auth().onAuthStateChanged(user => {
// If user obj does not exist --> redirect to login page
if (!user) {
next({ name: 'login' });
} else {
store.commit("user/SET_USER", user);
user.getIdToken().then(token => {
store.commit("user/SET_TOKEN", token)
});
next();
}
});
} else {
// Path does not required auth - Still we check the user
firebase.auth().onAuthStateChanged(user => {
// If user exist (is logged in) --> store in state.
if (user) {
store.commit("user/SET_USER", user);
user.getIdToken().then(token => {
store.commit("user/SET_TOKEN", token)
});
next();
} else {
next();
}
});
}
})
コメントで述べたように、受け入れられた答えはもはや機能しません。ユーザーがログインしているかどうかを確認する現在の方法は、
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
}
});
( https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onAuthStateChanged から)
その他のオプションsessionStorage
こちらをご覧ください:
Angular Firebase auth、ユーザーがログインしているかどうかを確認して、ナビゲーションからログインリンクを非表示にする方法
Angular 4を使用している場合は、 AngularFire2 -公式Firebase統合を使用できます。
AngularFire2をラップするAuthServiceがあります。サービスのコンストラクターでAuthSessionを取得し、必要なときに使用するだけです。例:
@Injectable()
export class AuthenticationService {
private authState: any;
constructor(public afAuth: AngularFireAuth) {
this.afAuth.authState.subscribe((auth) => {
this.authState = auth
});
}
get user(): any {
return this.authenticated ? this.authState : null;
}
}