[解決済み] node-jwt-simpleを使ったパスポートローカル
質問
passport-localを組み合わせて、認証に成功したときにJWTトークンを返すにはどうすればよいですか?
私は node-jwt-simple を見てみると パスポート.js をどうすればいいのかわかりません。
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);
});
}
));
done()を呼び出す際に、トークンを返すことは可能でしょうか? こんな感じです。(単なる擬似コード)
if(User.validCredentials(username, password)) {
var token = jwt.encode({username: username}, tokenSecret);
done(null, {token : token}); //is this possible?
}
そうでない場合、どのようにトークンを返せばよいのでしょうか?
どのように解決するのですか?
解決しました!
まず最初に、正しいストラテジーを実装する必要があります。私の場合はLocalStrategyです。そして、検証ロジックを提供する必要があります。例えば、日本酒の場合、passport-localのものを使ってみましょう。
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トークンの作成を追加する必要があるのは、ここです。このように。
(セッションを無効にすることを忘れないでください。さもなければ、シリアライズとデシリアライズ関数を実装しなければなりません。そして、セッションを永続化しないのであれば、それらは必要ありません(トークン・ベースの認証を使用している場合は必要ありません)。
passport-localの例から。(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経由でなければなりません)、上記の最初のコード片は提供されたユーザー名に基づいてユーザーを見つけようとし、パスワードが一致するかチェックします(もちろん、あなたのニーズに合わせて変更する必要があります)。
その後、ログインルートが呼び出され、そこでエラーまたは有効なトークンを返すようにすることができます。
これが誰かの助けになることを願っています。もし私が何か間違えたり、忘れたりしたことがあれば教えてください。
関連
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み】エラーです。EACCES: 権限が拒否されました、アクセス '/usr/local/lib/node_modules' 。
-
[解決済み】MongoDBでコレクションを日付で並べ替えるには?
-
[解決済み】MongoDBのデータ/DBが見つからない
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み] Mongoose Schema がモデルとして登録されていません。
-
[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能
-
[解決済み] パスポートの理解 シリアライズ デシリアライズ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】mongoError: トポロジーが破壊されました
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
webpack ENOENTソリューションの起動
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] npm install エラー - ローカルの発行者証明書を取得できません。
-
[解決済み] nvm は npm config の "prefix" オプションと互換性がありません。
-
[解決済み] node.js - リクエスト - "emitter.setMaxListeners() "はどのように?
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。
-
[解決済み] "app.use(express.cookieSession())" に "secret" オプションが必要です。
-
[解決済み] ノードのバージョンを管理するためのnまたはnvm - 各バージョンのグローバルモジュールを保持することは良いアイデアですか?