1

nodejs アプリケーションをゼロから開発しています。ノードで遊び始めたばかりです。ログインシステムを構築していますが、問題が見つかりました:

正しい名前とパスワードでログインすると、Cookie に「remember_token」値が設定されます。ユーザーセッションを保存することになっています。これは、Google Chrome ブラウザーの Cookie です。

トークン Cookie を記憶する

Cookie は正しく設定されていますが、ブラウザが新しいリクエストを行うと、Cookie の値がサーバーに設定されません。

覚えていないトークン

curl を介してリクエストを行うと、サーバーによって Cookie が受信されます。

curl -i 'http://localhost' -b "remember_token=ZnVuY3Rpb24gbm93KCkgeyBbbmF0aXZlIGNvZGVdIH0wLjA1NTg2MzU1MTU2MjY1MTk5"

curl 時にトークンを記憶する

追加情報

ミドルウェアが呼び出される前に、次の行を app.js に追加しました。

app.use(function(req, res, next){
  console.log('\nrequest: ' + JSON.stringify(req.headers));
  next();
});

これは、ブラウザからリクエストを行ったときの出力です。

request: {"host":"node","connection":"close","cache-control":"max-age=0","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36","referer":"http://localhost/","accept-encoding":"gzip,deflate,sdch","accept-language":"es-419,es;q=0.8,en;q=0.6,en-AU;q=0.4,en-CA;q=0.2,en-US;q=0.2,en-NZ;q=0.2,en-GB;q=0.2,en-ZA;q=0.2","cookie":"connect.sid=s%3AB8g0VGivuIuOt4A9DKl3WMFu.625Hfc6W4TiMUJyK4X9clfeNa0Fi8Pd%2Fdmg0sSPAW5E","if-none-match":"\"-651269513\""}

ヘッダーにトークン Cookie を記憶しません。テスト済み: google chrome、chromium、mozilla firefox。どうしてこれなの?

アップデート

これは私がクッキーを作成する方法です:

exports.identificar = function (req, res, success, fail) {
    var remember_token = null;
    var u;

    usuarios.findByEmail(req.body.sesion.email,function(usuario){
        if (usuario) {
            crypt.comparePassword(req.body.sesion.password, usuario.password_digest, function(err, resp) {
                if (err) {
                    fail('Hubo un error de encripción');
                } else if (resp) {
                    remember_token = usuario.remember_token;

                    u = usuario.toJSON();

                        delete u['password_digest'];
                        delete u['remember_token'];
                        delete u['fecha_token'];
                        delete u['token'];

                    if (typeof req.body.sesion.recordar !== "undefined"){
                        res.cookie('remember_token', remember_token, {expires: new Date(Date.now() + 900000), secure: true});   
                    } else {
                        res.cookie('remember_token', remember_token, {secure: true});
                    }
                    req.session.usuario = u;
                    success(u);
                } else {
                    fail('Contraseña incorrecta');
                }
            });
        } else {
            fail('Usuario no encontrado');
        }
    });
};

解決した

Cookieを設定するときにサーバーの「secure:true」オプションを削除することで最終的に解決しましたが、. なぜそれが起こったのですか?

4

1 に答える 1

1

セキュア オプションはセキュアな接続用です。Cookie を設定するときに、サーバーの "secure:true" フラグを削除する必要がありました。

于 2013-08-13T13:05:06.020 に答える