JSON Web Token(JWT)を使用したトークンベースの認証の実装方法


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語になるように調整してください。)