私はそれを考え出した!
まず、正しい戦略を実装する必要があります。私の場合はLocalStrategy、そして検証ロジックを提供する必要があります。例えば日本酒をパスポートローカルで使ってみましょう。
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
あなたが提供する検証コールバックはfunction(username, password, done)
、ユーザーを見つけ、パスワードが一致するかどうかを確認します(質問と私の回答の範囲を超えています)
passport.jsは、いくつかの要素が機能することを期待しています。1つは、戦略でユーザーを返すことです。私はコードのその部分を変更しようとしていましたが、それは間違っていました。コールバックはfalse
、検証が失敗した場合、およびobject
(検証されたユーザー)が成功した場合を想定しています。
では、JWTを統合する方法は?
ログインルートでは、成功した認証または失敗した認証を処理する必要があります。そして、ここにJWTトークン作成を追加する必要があります。そのようです:
(セッションを無効にすることを忘れないでください。そうしないと、シリアライズおよびデシリアライズ機能を実装する必要があります。また、セッションを永続化しない場合は必要ありません。トークンベースの認証を使用している場合は不要です)
パスポートローカルの例から:(JWTトークンが追加されています)
// POST /login
// This is an alternative implementation that uses a custom callback to
// achieve the same functionality.
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
return res.json(401, { error: 'message' });
}
//user has authenticated correctly thus we create a JWT token
var token = jwt.encode({ username: 'somedata'}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
これで完了です。/ loginとPOSTユーザー名とパスワード(常にSSLを使用する必要があります)を呼び出すと、上記の最初のコードスニペットは、指定したユーザー名に基づいてユーザーを検索し、パスワードが一致することを確認します(もちろん、ニーズに合わせて変更してください)。
その後、ログインルートが呼び出され、そこでエラーまたは有効なトークンを返すことができます。
これが誰かを助けることを願っています。そして私が何か間違いをしたり何かを忘れたりした場合は私に知らせてください。