メインコンテンツまでスキップ

ガイド: Node (Express)

ステップ 1: リクエストヘッダーから Bearer トークンを抽出する

認可 (Authorization) されたリクエストには、Bearer <アクセス トークン> を内容とする Authorization ヘッダーが含まれている必要があります。リクエストヘッダーから認可トークンを抽出します:

// auth_middleware.ts

import { IncomingHttpHeaders } from 'http';

const extractBearerTokenFromHeaders = ({ authorization }: IncomingHttpHeaders) => {
const bearerTokenIdentifier = 'Bearer';

if (!authorization) {
throw new Error({ code: 'auth.authorization_header_missing', status: 401 });
}

if (!authorization.startsWith(bearerTokenIdentifier)) {
throw new Error({ code: 'auth.authorization_token_type_not_supported', status: 401 });
}

return authorization.slice(bearerTokenIdentifier.length + 1);
};

ステップ 2: トークンの検証

デモンストレーションのために、jose パッケージを使用してトークンの署名、有効期限、必要なクレームを検証します。

jose を依存関係としてインストールする

npm i jose --save

Logto の OIDC 設定を取得する

受信した JWS トークンの署名とソースを検証するために、JWK 公開鍵セットとトークン発行者が必要です。最新の Logto 認可 (Authorization) 設定はすべて https://<your-logto-domain>/oidc/.well-known/openid-configuration で見つけることができます。

例:https://tenant-id.logto.app/oidc/.well-known/openid-configuration を呼び出し、レスポンスボディ内の次の 2 つのフィールドを見つけます:

{
"jwks_uri": "https://tenant-id.logto.app/oidc/jwks",
"issuer": "https://tenant-id.logto.app/oidc"
}

認証 (Authentication) ミドルウェアを追加する

Jose の jwtVerify メソッドは、トークンの JWS 形式、トークン署名、発行者、オーディエンス、そして有効期限の状態を検証するのに役立ちます。検証に失敗した場合、例外がスローされます。

警告:

ロールベースのアクセス制御 (RBAC) を使用している場合、スコープの検証も必要です。

// auth-middleware.ts

import { createRemoteJWKSet, jwtVerify } from 'jose';

//...

export const verifyAuthFromRequest = async (req, res, next) => {
// トークンを抽出する
const token = extractBearerTokenFromHeaders(req.headers);

const { payload } = await jwtVerify(
token, // リクエストヘッダーから抽出された生の Bearer トークン
createRemoteJWKSet(new URL('https://<your-logto-domain>/oidc/jwks')), // Logto サーバーから取得した jwks_uri を使用して jwks を生成
{
// トークンの期待される発行者、Logto サーバーによって発行されるべき
issuer: 'https://<your-logto-domain>/oidc',
// 期待されるオーディエンストークン、現在の API のリソースインジケーターであるべき
audience: '<your request listener resource indicator>',
}
);

// RBAC を使用している場合
assert(payload.scope.includes('some_scope'));

// カスタムペイロードロジック
userId = payload.sub;

return next();
};

ミドルウェアを API に適用する

import { verifyAuthFromRequest } from '/middleware/auth-middleware.ts';

app.get('/user/:id', verifyAuthFromRequest, (req, res, next) => {
// カスタムコード
});

Express.js API を JWT と Logto で保護する