83

私の質問はこれに似ていますが、彼の解決策についての洞察はありませんでした。

Instagramを使用して認証するためにPassportを使用しています。認証が成功すると、ユーザーは「/」に誘導されます。この時点で、リクエストにはユーザー オブジェクトが含まれています (別名、機能しています)。ただし、リダイレクトすると、 req.user は未​​定義です。:'(

奇妙な点は、それぞれのリクエストで、passport.deserializeUser が呼び出されていることです。ユーザーオブジェクトを正常に取得していますが、ミドルウェアの道のどこかで、 req.user が設定されていません (または設定解除されています)。

// on successful auth, goto "/" 
app.get('/', function(req, res) {
    // if the request has the user object, go to the user page
    if (req.user) {
        res.redirect("/user/" + req.user._id);
    }

    res.render("index");
}

app.get('/user/:uid', function(req, res) {
    console.log(req.user) // undefined
}
4

26 に答える 26

68

私の問題は、クライアント側でフェッチを使用するときに Cookie を送信するように指定していませんでした。リクエストに credentials: 'include' フィールドを含めた後、機能しました。

fetch('/api/foo', {credentials: 'include'})
于 2016-12-24T20:34:37.707 に答える
51

アプリのセッション状態を設定しましたか? そうでない場合は、このようなものが必要です...

app.use(session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
于 2013-05-08T12:13:31.770 に答える
19

私はノードに非常に慣れていませんが、それは私にとってミドルウェアの問題でした. bodyParser を追加し、再配置して修正しました。

壊れたコード:

app.use(express.cookieParser('secret'));
app.use(express.cookieSession());
app.use(express.session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public'))); 

作業コード:

app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);

お役に立てれば

于 2014-03-20T05:56:47.250 に答える
13

以前はこれらのコードを持っていました (動作しませんでした):

app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('abcdefg'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
    secret: 'abcdefg',
    resave: true,
    saveUninitialized: false,
    cookie: { secure: true } // this line
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));

次に、セッション初期化子から Cookie オプションを削除します。

app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('abcdefg'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
    secret: 'abcdefg',
    resave: true,
    saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));

そして今それは動作します。

于 2016-03-13T12:16:05.533 に答える
4

Express 4を使用してまったく同じ問題が発生し、オンラインで見つけることができるほとんどすべてを試した後、最終的に「cookie-session」を追加して機能させることができました。

var cookieSession = require('cookie-session');

app.use(cookieSession({
  keys: ['key1', 'key2']
}));
于 2015-02-14T10:27:20.600 に答える
3

ユーザーを認証すると、リクエスト値req.userが入力されます。ユーザーを識別してその値を入力するかどうかを知るために、Cookie が使用されます。私のように、安全な Cookie を使用してセッションを構成すると、Cookie は でのみ使用可能になりますHTTPS。これは、たとえば、ローカル開発サーバーの標準構成ではありません。Cookie を機能させるHTTPには、コメント アウトするcookie: { secure: true }と、req.user値が適切に構成されます。

this.app.use(session({
    resave: true,
    saveUninitialized: true,
    secret: process.env.SESSION_SECRET || "a secret",
    // cookie: { secure: true },
}));

合理的に、本番環境でのみ Cookie が必要な場合は、HTTPS次のようにすることができます。

cookie: { secure: process.env.ENV === 'PRODUCTION' }
于 2019-02-07T16:06:12.227 に答える
3

ルートでは、以下を追加してみてください:{session: true}

app.get('/auto-login', passport.authenticate('cross', {session: true}))
于 2013-10-16T19:27:03.210 に答える
0

まったく同じ問題がありました。私にとっての解決策は、「express-session」の代わりに「client-sessions」を使用することでした.おそらくセッション構成が悪いのでしょうか?

動作しないコード:

var session = require('express-session');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(session({
    secret: 'random string',
    resave: true,
    saveUninitialized: true,
    cookie: { secure: true }
}));

作業コード:

var session = require('client-sessions');

        app.use(bodyParser.urlencoded({ extended: false }));
        app.use(express.static(path.join(__dirname, 'public')));
        app.use(cookieParser());
        app.use(bodyParser.json());
        app.use(session({
        cookieName: 'session',
        secret: 'random string',
        duration: 30 * 60 * 1000,
        activeDuration: 5 * 60 * 1000,
    }));
于 2016-09-29T16:53:54.460 に答える
0

これと同じ問題に遭遇しましたが、私のものは、OAuth フローと OAuth コールバック ルートの開始passport.authorizeとの違いの誤解に関連していました。passport.authenticate

passport.authorize変数には影響しませんreq.userが、戦略のドキュメントからサンプル コードをコピー パスタしただけなので、間違った方法が使用されていることに気付きませんでした。passport.authenticateユーザー変数に変更した後、利用可能になりました。

知らず知らずのうちに同じことをしている方の参考になれば幸いです。

于 2020-03-01T23:36:33.613 に答える
0

secretKey を cookieParser に挿入しようとしましたか?

var passport = require('passport');
var expressSession = require('express-session');

app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('mySecretKey'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressSession({
secret: 'mySecretKey',
  resave: false,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
于 2015-08-12T14:00:37.383 に答える
-1

bcrpt-node と矢印関数に関する別の問題がありました。

動作するコード:

userSchema.methods.generateHash = function (password) {
  return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
};

userSchema.methods.isValidPassword = function (password) {
  return bcrypt.compareSync(password, this.password);
};

動作しないコード:

userSchema.methods.generateHash = (password) => {
  return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

userSchema.methods.isValidPassword = (password) => {
  return bcrypt.compareSync(password, this.password);
};
于 2016-06-04T12:06:00.090 に答える