2016-08-31 8 views
4

私はちょっとした問題があり、それは簡単なようですが、私は何をすべきかを頭に入れているようです。ユーザーがfirebase経由でログインしている場合に別のページを表示するには

私はFirebaseを使ってデータを保存するエクスプレスアプリを持っています。私はログインし、登録し、クライアント側のスクリプトを使ってログアウトすることができますが、私の問題は次のとおりです。ログインしたユーザーに別のページを送信できるようにするには、

var firebase = require('firebase'); 
// Initialize Firebase 
var config = { 
serviceAccount: "./Chat Application-ad4eaaee3fcc.json", 
databaseURL: "MY_DATABASE_URL" 
}; 
firebase.initializeApp(config); 

し、私は、ユーザーのログインのための特別なページを表示したい、これは私が試したものです::

これは私のコードは、これまでのところです

router.get("/special-page", function(req, res, next) { 
    var user = firebase.auth().currentUser; 
    console.log(user); // this variable gets undefined 
    if(user) { 
     res.render("special-page"); 
    } else { 
     res.redirect("/"); 
    } 
}); 

私はこれを知っています簡単な質問のように思えるかもしれませんが、どんな助けでも大歓迎です!

ありがとうございます。

答えて

6

ユーザー側とサーバー側は全く異なる実行領域です。したがって、おそらく推測したように、クライアント上で認証が発生した場合は、サーバ上で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(); 
    }); 
+0

こんにちは!あなたのソリューションを実装しようとしていますが、問題が発生しました:http://stackoverflow.com/questions/41720801/why-is-req-cookies-undefinedどうぞご覧ください。 ^^ – Coder1000

関連する問題