2017-07-17 7 views
0

ノードjsを使用してミドルウェアを記述しようとしています。ユーザーが認証されていない場合、ログインページにリダイレクトされます。ノードjsリダイレクト - ミドルウェア

これはうまくいきましたが、ログインページにリダイレクトされると、何度もログインページにリダイレクトされ続けます。

コンソール(ループ):プロファイルでない認証されたユーザ

認証

function isAuthenticated(){ 
    var user = firebase.auth().currentUser; 
    console.log(user); 
    if(user && user !== null){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

ためFirebase方法それはreturninれるログイン

app.get('/login',function(req,res){ 
    if (isAuthenticated()) { 
     res.redirect('/profile'); 
    }else{ 
     res.sendFile(path.join(__dirname+'/login.html')); 
    } 

}); 

EDITについて

app.get('/profile',function(req,res){ 
    if (isAuthenticated()) { 
     res.sendFile(path.join(__dirname+'/site/profile.html')); 
    }else{ 
     console.log('not authenticated user at profile'); 
     res.redirect('/login'); 
    } 
}); 

g null

+0

私はここに何か間違って見ていない、どこかにある必要があります。 –

+0

編集 –

+1

を参照してください。なぜリダイレクトを使用するのですか?ミドルウェアとしてログインページを接続し、認証情報が要求と共に送信されない場合には常に '401'ステータスコードでそれを表示することができます。 –

答えて

2

私はリダイレクトを使用しませんが、authenticationRequiredミドルウェアを書いています。このミドルウェアは401ステータスコードを送信してログインページを表示するか、リクエストを次のコールバックに転送します。

function authenticationRequired(req, res, next) { 
    if(isAuthenticated()) { 
     next() 
    } else { 
     res.status(401).sendFile(path.join(__dirname, 'login.html')); 
    } 
} 


// register the middleware for only one route 
app.get('/profile', authenticationRequired, function(req,res) { 
    res.sendFile(path.join(__dirname, 'site/profile.html')); 
}); 

// or register the middleware for all routes that follow 
app.use(authenticationRequired) 

app.get('/profile', function(req,res) { 
    res.sendFile(path.join(__dirname+'/site/profile.html')); 
}); 

手動でユーザーが正しいURLに滞在するユーザー最初のケースでは、ログイン後に開こうとしたURLを追跡する必要はありませんこの方法です。その横に

あなたの代わりにリソースを使用すると、認証が要求されたリソースを表示するために必要なブラウザに指示401を送る別の場所で一時的なものであることをブラウザに指示302の、正しいステータスコードを使用します。

+0

回答ありがとう!私はあなたが言ったのと同じことを実装しましたが、1秒から2秒後にはまだリロードしています。ここに私が実装したコードがあります。 [PasteBin Link](https://pastebin.com/mFp8ZuXy) –

+1

これは、リロードする他のコードがあることを示しています。リフレッシュまたはjsコードを実行するHTMLタグがありますか?表示されているサーバー側のコードにはこのような影響はありません。 –

+0

ああああ! firebase onAuthStateChanged関数を使用しています。ユーザーがログに記録されている場合、ユーザーをリダイレクトします。私はリダイレクトしていた1行をコメントしました。ここには[コード](https://pastebin.com/GngKAJa9)があります。しかし、私はこのことに対して初めてです。 ** authStateIsChanged **をログインすると不思議ですが、ユーザーをプロフィールにリダイレクトしますか?私はその行をコメントしたので。 –