メインコンテンツまでスキップ
バージョン: 0.13.0 (Previous)

🔗 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, onetimetokens},
{authSecrets: {authEncSecret: 'replace-me', authSignSecret: 'replace-me'}},
{googleOAuthDriver, twitterOAuthDriver, lineOAuthDriver},
),
);
構成デフォルト / ソース動作効果
dataStores.identitiesすべてのコールバックで必須プロバイダーアイデンティティを検索し、oauth-signup 用に作成します。
dataStores.onetimetokensすべてのコールバックで必須生成されたログイン用ワンタイムトークンを保存します。
configuration.authSecrets開始とコールバックで必須プロバイダー state に署名し、Google/LINE コールバックで検証します。最終ワンタイムトークンにも署名します。
configuration.onetimeTokenSignOptionsプロバイダー state または最終ログイントークンの生成に渡されます。authService のデフォルトは { expiresIn: '5m' }ワンタイムトークンの有効期間を制御します。
プロバイダードライバーその 2 つのルートで必須requestcallback を提供します。リクエスト前に initialize(app) を呼び出します。

Google と LINE の開始 state には、fppurposeredirectUrl、省略可能な typeId、ユーザーエージェントが含まれます。Twitter は、プロバイダーのコールバック state を管理するドライバーに { purpose, redirectUrl, typeId } を渡します。stateQueryParameter はエクスポートされていますが、SDK はコールバッククエリをスキーマで検証しません。

よくあるタスク

タスク開始地点契約
Google ログインまたはサインアップを開始するgoogleOAuthFeatureパブリックな googleOAuthFeaturegoogleOAuthRoute。クエリ値は googleOauthSchema に従います。
LINE ログインまたはサインアップを開始するlineOAuthFeatureパブリックな lineOAuthFeaturelineOAuthRoute。クエリ値は lineOauthSchema に従います。
Twitter ログインまたはサインアップを開始するtwitterOAuthFeatureパブリックな twitterOAuthFeaturetwitterOAuthRoute。クエリ値は 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 を受け取ります。コールバックはアイデンティティを解決または作成し、ワンタイムログイントークンを保存して、デコード済み redirectUrlonetimeToken を追加した 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.mdvalidators.md ページはありません。Authentication を介して合成されます。

関連モジュール

Authentication は、これを含むサービスとワンタイムトークンログインを提供します。Authentication サービス は構成とマウントを定義します。OAuth ドライバー は Google、Twitter、LINE のドライバーファクトリーとミドルウェアを定義します。Authentication ブロック はトークン、フィンガープリント、アイデンティティのヘルパーを提供し、共通ブロック は最終リダイレクトを提供します。