次の構成で「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
で失敗します。これは通常、 関数serializeUser
とdeserializeUser
関数が存在しないことを示します。この場合を除いて、それらはそうです。私はパスポートのソースを調べて、ここに行きました(の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
正確に何が問題なのかわかりません。どんな助けでも大歓迎です。