Nodejsアプリケーションを開発し、認証にpassportjsを使用しています。私はパスポートのローカル戦略を使用しています。しかし、ログインしようとすると、次のエラーが発生します。
Error: Unknown authentication strategy "local"
at attempt (/home/project/node_modules/passport/lib/middleware/authenticate.js:166:37)
at authenticate (/home/project/node_modules/passport/lib/middleware/authenticate.js:338:7)
at exports.authenticate (/home/project/controllers/RegistrationsController.js:87:4)
at callbacks (/home/project/node_modules/express/lib/router/index.js:164:37)
at param (/home/project/node_modules/express/lib/router/index.js:138:11)
at pass (/home/project/node_modules/express/lib/router/index.js:145:5)
at Router._dispatch (/home/project/node_modules/express/lib/router/index.js:173:5)
at Object.router (/home/project/node_modules/express/lib/router/index.js:33:10)
at next (/home/project/node_modules/express/node_modules/connect/lib/proto.js:193:15)
at /home/project/node_modules/express-flash/lib/express-flash.js:31:7
これが私のpassport-config.jsファイルです:
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/user');
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
passport.use({usernameField: 'emailAddress'}, new LocalStrategy(function(username, password, done) {
User.findOne({ emailAddress: username }, function(err, user) {
if(err){
return done(err);
}
if (!user) {
return done(null, false, { message: 'Email ' + username + ' not found'});
}
else{
//check if password matches and pass parameters in done accordingly
}
});
}));
以下は、私の認証APIが存在するRegistrationsController.jsファイルです。
var passport = require('passport');
exports.authenticate = function(req, res, next){
console.log('Login request!');
passport.authenticate('local', function(err, user, info) {
console.log('In authenticate callback!');
if (err) return next(err);
if (!user) {
req.flash('errors', { msg: info.message });
res.status(500).json({message: info.message});
}
res.json(user);
})(req, res, next);
}
過去2日間からコードを調べていますが、まだエラーを特定できませんでした。 passport
モジュールとpassport-local
モジュールの両方をインストールしました。どんな助けでも大歓迎です。
このコードには構文エラーがあります。 usernameField: 'emailAddress'
このようにLocalStrategyコンストラクターに渡す必要があります...
passport.use(new LocalStrategy({
usernameField: 'email'
}, yourAuthenticateFunction));
_npm install --save passport-local
_を実行してから、app.jsに次の行を含めますvar LocalStrategy = require("passport-local");
次に、このミドルウェアを使用します。
_app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
_
_app.ts
_ファイルがパスポート構成をインポートしていても、ルートに割り当てられていなかったため、ファイルが解析されなかったため、これが発生していました。 _POST /login
_を認証するためにコントローラー内で使用していました。
免責事項-「解析された」が正しいWordであるかどうかはわかりませんが、そのファイルのconsole.log('xfngr')
はその後まで出力されなかったため、そうであるように見えました。ルートを入れました。
app.ts
_...
import * as passportConfig from "./config/passport";
...
...
_
passportConfig
のプロパティを使用していたルートを追加すると、再び機能し始めました。
app.ts
_...
import * as passportConfig from "./config/passport";
...
...
...
app.get("/account", passportConfig.isAuthenticated, userController.getAccount);
_