2017-07-29 15 views
1

私はSails.jsを使用しており、セッションにユーザー情報を保存して簡単なログインをしようとしています。ここでは、ログインアクションのための私のコードは次のとおりです。Sails.jsセッションが最初のリクエスト時に保存されない

AuthService.login(req.body.email, req.body.password).then(user => { 

    // save user information in the session 
    req.session.user = user; 
    req.session.authenticated = true; 

    return res.json({ 
     user:user, 
     token:token 
    }); 
}).catch(err => { 
    sails.log.error(err); 
    res.json(403, { 
    callstack: err.callstack, 
    error: 'Authentication error', 
    reason : err.reason 
    }); 
}); 

これは、他のページ(ログイン後)のための私のポリシーです:

module.exports = function(req, res, next) { 

    // User is allowed, proceed to the next policy, 
    if (req.session.authenticated && req.session.user) { 
     return next(); 
    } 

    // User is not allowed 
    return res.forbidden('You are not permitted to perform this action. (Authenticated)'); 
    }; 

問題は、セッションデータを最初にするために保存されていないということですリクエストは、私が最初に成功したログインの後を禁止されている403の意味を取得しています。その結果、セッションデータが表示されるようにログアウトして再度ログインする必要があります。

ではなく、(認証ポリシー付き)のログインに制限されていますが、ポリシーの有無にかかわらずセッションデータを必要とするアクションにも適用されます。また、サーバーが初めて起動するときだけでなく、新しいセッションごとに発生します。


私はので、私はまた、次のように設定/ session.jsを変更することで、セッションストアとしてのRedisで動作するようにSail.jsを設定しようとした問題は、メモリのセッションを使用したためであったと思った:

adapter: 'redis', 

    // host: 'localhost', 
    // port: 6379, 
    // ttl: 60*60*20, 
    // db: 0, 
    // prefix: 'sess:', 

私は、アダプタの行をコメント解除し、オプションのRedisの接続パラメータととせずに試してみましたが、その後req.sessionは、私は、接続-Mongoのアダプタを使用してい

+0

わからない何が起こっているかを私はこのような問題を経験したことはありません。しかし、セッション情報をJWTトークンに入れないのはなぜですか?私が見ることができるように、トークンロジックを使用しています... – hlozancic

+0

回避策があり、単にJWTトークンに入れても、それはやや帆の目的を敗北させると思います... – Aaron

+0

私はあなたに競争条件があると思います2つのクッキーが同じセッションに設定されています。おそらくフロントエンドのローディングスピナーにアイコン用のウェブフォントを読み込んでいたり、ログインして「送信」をクリックしたときに動的に読み込まれる画像のような他の資産がある場合は、 -loaded _ユーザーはログインフォームを送信する前に – sgress454

答えて

0

どこでも、未定義の宣言と同様の問題を発見しました。なぜなら、req.session.user = userを使用すると、バックグラウンドコードがセッションをDBに保存しているからです(私の場合、Mongo、あなたのRedisにあります)。が完了してからになると、コードはres.jsonの部分を実行します。 DB省の非同期コードに対処するために

、このような何かをしよう(あなたのコードをテストしていませんが、私の場合にそれをやって、問題解決):

AuthService.login(req.body.email, req.body.password).then(user => { 

    // save user information in the session 

    // this is on memory 
    req.session.user = user; 
    req.session.authenticated = true; 

    // now the session is saved in DB 
    req.session.save(function() { 
     return res.json({ 
     user:user, 
     token:token 
     }); 
    } 
    }).catch(err => { 
    sails.log.error(err); 
    res.json(403, { 
    callstack: err.callstack, 
    error: 'Authentication error', 
    reason : err.reason 
    }); 
}); 
関連する問題