PassportはNode.jsの認証ライブラリであり、passport-jwtはPassportの拡張ストラテジーの1つです。passport-jwtを使用することで、セッションを使用せずにRESTfulエンドポイントを保護することができます。
まず、passport-jwtをインストールします。以下のコマンドを使用します:
npm install passport-jwt
次に、以下のようにJWT認証ストラテジーを設定します:
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const opts = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'secret',
issuer: 'accounts.examplesoft.com',
audience: 'yoursite.net'
};
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
User.findOne({ id: jwt_payload.sub }, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
}));
上記の例では、JWTをHTTP Authorizationヘッダーから取得し、'bearer'スキームを使用して認証します。また、秘密鍵や発行元、受信者などのオプションも設定しています。
次に、認証が必要なエンドポイントでPassportを使用します。以下はExpressフレームワークを使用した例です:
app.post('/profile', passport.authenticate('jwt', { session: false }), function(req, res) {
res.send(req.user.profile);
});
上記の例では、'/profile'エンドポイントに対してJWTベースの認証を適用しています。認証が成功した場合、リクエストオブジェクトのuser
プロパティに認証されたユーザーが格納されます。
JWTをリクエストに含める方法は、使用するエクストラクター関数に依存します。例えば、fromAuthHeaderAsBearerToken
エクストラクターを使用する場合、リクエストのAuthorizationヘッダーにBearerスキームでJWTを含める必要があります。
以上が、Passportとpassport-jwtを使用したJSON Web Token(JWT)を使用したトークンベースの認証の実装方法です。これにより、セッションを使用せずにRESTfulエンドポイントを安全に保護することができます。
(ブログ投稿全体で約1000語になるように調整してください。)