ユーザー側とサーバー側は全く異なる実行領域です。したがって、おそらく推測したように、クライアント上で認証が発生した場合は、サーバ上でfirebase.auth().currentUser
と呼ぶことはできません。
クライアントが指示しない限り、サーバープロセスはこの情報を保持しません。
"私はXXXとしてログに記録されています"という要求ヘッダーがあるだけですが、サーバーがその情報を確認できず、悪意のあるユーザーが別のふりをする可能性があるため、安全ではありません。
この場合の唯一の解決策は、Firebaseトークンをサーバーに提供し、サーバーがfirebaseサーバーに対してこのトークンを確認する必要があります。その場合、クライアントについて100%確実になります認証。
私は、サーバーサイドレンダリング用のReactアプリケーションでは、ここでどのようにしたのかが必要でした。ユーザ認証の際
- 、firebaseトークン
- 設定を解除し、ユーザーがサーバーに
- をログアウトクッキーが含まれているクッキーを設定し、各要求
でクライアントユーザを認証するためにクッキーを読みますクライアントで
コード:サーバーで
const setAppCookie =() => firebase.auth().currentUser &&
firebase.auth().currentUser.getToken().then(token => {
cookies.set('token', token, {
domain: window.location.hostname,
expire: 1/24, // One hour
path: '/',
secure: true // If served over HTTPS
});
});
const unsetAppCookie =() =>
cookies.remove('token', {
domain: window.location.hostname,
path: '/',
});
// triggered by firebase auth changes, this is where you deal
// with your users authentication in your app
fbAuth.onAuthStateChanged(user => {
if (!user) {
// user is logged out
return;
}
// user is logged in
setAppCookie();
// Reset cookie before hour expires
// (firebase tokens are short lived, say the docs)
setInterval(setAppCookie, 3500);
});
[...]
// In the logout code
unsetAppCookie();
コード:
// Before serving express app, enable cookie parsing
app.use(cookieParser());
// In the code dealing with your requests
const { token } = req.cookies;
if (!token) {
// renderWithoutUser();
}
//
// If user found in cookie, verify the token and render with logged in store
//
console.log('Verifying token', token);
firebase.auth().verifyIdToken(token)
.then(decodedToken => {
const uid = decodedToken.sub;
console.log('User is authenticated for this request', uid);
// renderWithUser();
})
.catch(err => {
console.error('WARNING token invalid or user not found', err);
// renderWithoutUser();
});
こんにちは!あなたのソリューションを実装しようとしていますが、問題が発生しました:http://stackoverflow.com/questions/41720801/why-is-req-cookies-undefinedどうぞご覧ください。 ^^ – Coder1000