3

次の構成で「feathers-passport」を使用して、ノード アプリに認証を追加しています。

.configure(feathersPassport({
    secret: 'some-secret',
    store: new MongoStore({db: 'demo-session'}),
    resave: false,
    saveUninitialized: false
}))

そして、パスポートを構成します。

var localOptions = {
    usernameField: 'email',
    passwordField: 'password'
};

passport.serializeUser(function(user, done) {
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {
  api.service('users').get(id, {}, done);
});

passport
    .use(new LocalStrategy(localOptions, function(email, password, done){
        api.service('users').authenticateLocal(email, password, done);
    }))

認証するには、次のルートを設定します。

.post('/users/authenticate', function(request, response, next){
    passport.authenticate('local', function(error, user){
        //error comes back as null and user is a valid object
        request.login(user, function(error){
            if(error) return next(error);
            if(!user) return next(new Error("no user found"));
            else {
                var token = tokenIssue({id: user.id});
                response.status(201).json({token: token, id: user.id});
            }
        });
    })(request, response, next);
})

ただし、セッションのシリアライゼーションは常に標準エラー:Failed to serialize user into sessionで失敗します。これは通常、 関数serializeUserdeserializeUser関数が存在しないことを示します。この場合を除いて、それらはそうです。私はパスポートのソースを調べて、ここに行きました(の265行目authenticator.js):

var stack = this._serializers;
(function pass(i, err, obj) {
// serializers use 'pass' as an error to skip processing
  if ('pass' === err) {
    err = undefined;
  }
  // an error or serialized object was obtained, done
  if (err || obj || obj === 0) { return done(err, obj); }

  var layer = stack[i];
  if (!layer) {
    return done(new Error('Failed to serialize user into session'));
  }

this._serializers[]が呼び出されたときに出力されるためvar layer = stack[i]、チェックif(!layer)は常にパスするため、エラーがスローされます。シリアル化関数を定義したことをパスポートが認識していないように見えますが、それがパスポートの結果なのか、使用の結果なのかわかりませんfeathers-passport。私はガイドに非常に厳密に従いましたが、feathers-passport正確に何が問題なのかわかりません。どんな助けでも大歓迎です。

4

0 に答える 0