🔗 OAuth
OAuth は Google、LINE、Twitter 向けのパブリックなブラウザー開始・コールバックルートを提供します。独立した OAuth サービスではなく、authService により合成されます。
はじめに
各プロバイダードライバーを作成し、そのミドルウェアを Express アプリに登録してから、authService をマウントします。プロバイダーに登録するコールバック URL は、SDK ルートと同じマウントプレフィックスを含める必要があります: /auth/oauth/google/callback、/auth/oauth/line/callback、または /auth/oauth/twitter/callback。Twitter を有効にする場合は、以下のルートマウントを使用してください。そのドライバーは、プレフィックスのない Twitter SDK パスに対してのみセッションミドルウェアをインストールします。
import express from 'express';
import {drivers, services} from '@nodeblocks/backend-sdk';
const app = express();
const googleOAuthDriver = drivers.createGoogleOAuthDriver(
'google-client-id',
'google-client-secret',
'https://app.example.test/auth/oauth/google/callback',
);
const twitterOAuthDriver = drivers.createTwitterOAuthDriver(
'twitter-client-id',
'twitter-client-secret',
'https://app.example.test/auth/oauth/twitter/callback',
'replace-with-a-session-secret',
);
const lineOAuthDriver = drivers.createLineOAuthDriver(
'line-client-id',
'line-client-secret',
'https://app.example.test/auth/oauth/line/callback',
);
twitterOAuthDriver.initialize(app);
googleOAuthDriver.initialize(app);
lineOAuthDriver.initialize(app);
app.use(
'/',
services.authService(
{identities, refreshtokens, onetimetokens},
{authSecrets: {authEncSecret: 'replace-me', authSignSecret: 'replace-me'}},
{googleOAuthDriver, twitterOAuthDriver, lineOAuthDriver},
),
);
| 構成 | デフォルト / ソース動作 | 効果 |
|---|---|---|
dataStores.identities | すべてのコールバックで必須 | プロバイダーアイデンティティを検索し、oauth-signup 用に作成します。 |
dataStores.refreshtokens | authService で必須 | 生成されたリフレッシュトークンを保存します。 |
dataStores.onetimetokens | すべてのコールバックで必須 | 生成されたログイン用ワンタイムトークンを保存します。 |
configuration.authSecrets | 開始とコールバックで必須 | プロバイダー state に署名し、Google/LINE コールバックで検証します。最終ワンタイムトークンにも署名します。 |
configuration.onetimeTokenSignOptions | プロバイダー state または最終ログイントークンの生成に渡されます。authService のデフォルトは { expiresIn: '5m' } | ワンタイムトークンの有効期間を制御します。 |
| プロバイダードライバー | その 2 つのルートで必須 | request と callback を提供します。リクエスト前に initialize(app) を呼び出します。 |
Google と LINE の開始 state には、fp、purpose、redirectUrl、省略可能な typeId、ユーザーエージェントが含まれます。Twitter は、プロバイダーのコールバック state を管理するドライバーに { purpose, redirectUrl, typeId } を渡します。stateQueryParameter はエクスポートされていますが、SDK はコールバッククエリをスキーマで検証しません。
よくあるタスク
| タスク | 開始地点 | 契約 |
|---|---|---|
| Google ログインまたはサインアップを開始する | googleOAuthFeature | パブリックな googleOAuthFeature と googleOAuthRoute。クエリ値は googleOauthSchema に従います。 |
| LINE ログインまたはサインアップを開始する | lineOAuthFeature | パブリックな lineOAuthFeature と lineOAuthRoute。クエリ値は lineOauthSchema に従います。 |
| Twitter ログインまたはサインアップを開始する | twitterOAuthFeature | パブリックな twitterOAuthFeature と twitterOAuthRoute。クエリ値は twitterOauthSchema に従います。 |
| プロバイダーからの戻りを処理する | OAuth コールバック機能 | 対応するパブリックコールバック機能/ルートは、指定された redirectUrl に ?onetimeToken=<token> を付加してリダイレクトします。 |
ブラウザーワークフロー
GET /auth/oauth/google?fp=device-fingerprint&purpose=oauth-login&redirectUrl=https%3A%2F%2Fclient.example.test%2Foauth%2Fcomplete に移動します。Google ドライバーはブラウザーを Google にリダイレクトします。oauth-signup では typeId を指定してください。スキーマレベルでは省略可能ですが、アイデンティティ作成では値がないと 400 で拒否されます。
プロバイダー認証後、Google と LINE は state を受け取り、Twitter はドライバー管理のコールバック state を受け取ります。コールバックはアイデンティティを解決または作成し、ワンタイムログイントークンを保存して、デコード済み redirectUrl に onetimeToken を追加した 302 リダイレクトを発行します。リダイレクトヘルパーは常に ?onetimeToken= を追加するため、呼び出し元はクエリ文字列の動作を許容できるリダイレクト URL を指定する必要があります。
カスタム機能の合成
サービスが通常の統合ポイントです。カスタムホストでは、同じストア、構成、プロバイダードライバーを合成コンテキストで渡す必要があります。機能は Express ミドルウェアではなく SDK コンポーザーです。
import {partial} from 'ramda';
import {features, primitives} from '@nodeblocks/backend-sdk';
const router = primitives.defService(
partial(primitives.compose(features.googleOAuthFeature, features.googleOAuthCallbackFeature), [
{configuration, dataStores: {identities, onetimetokens}, googleOAuthDriver},
]),
);
app.use('/', router);
リファレンスマップ
| ページ | 目的 |
|---|---|
| ブロック | プロバイダー state、トークン、フィンガープリント、リダイレクトのヘルパー。 |
| 機能 | スキーマからルートへの OAuth 合成。 |
| ルート | パブリックな開始・コールバックエンドポイントの契約。 |
| スキーマ | プロバイダー開始クエリの検証。 |
OAuth には handlers.md や validators.md ページはありません。Authentication を介して合成されます。
関連モジュール
Authentication は、これを含むサービスとワンタイムトークンログインを提供します。Authentication サービス は構成とマウントを定義します。OAuth ドライバー は Google、Twitter、LINE のドライバーファクトリーとミドルウェアを定義します。Authentication ブロック はトークン、フィンガープリント、アイデンティティのヘルパーを提供し、共通ブロック は最終リダイレクトを提供します。