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

🛣️ OAuth ルート

OAuth ルートは Express ミドルウェアではなく SDK コンポーザーです。プロバイダードライバーがブラウザーリダイレクトを実行し、コールバックルートがワンタイムログイントークンを作成してブラウザーをリダイレクトします。

一覧

ルートメソッド / プロトコルパススキーマバリデーター成功ステータス
googleOAuthRouteGET / HTTP/auth/oauth/googlegoogleOauthSchemaなしドライバーリダイレクト
googleOAuthCallbackRouteGET / HTTP/auth/oauth/google/callbackなしなし302 リダイレクト
lineOAuthRouteGET / HTTP/auth/oauth/linelineOauthSchemaなしドライバーリダイレクト
lineOAuthCallbackRouteGET / HTTP/auth/oauth/line/callbackなしなし302 リダイレクト
twitterOAuthRouteGET / HTTP/auth/oauth/twittertwitterOauthSchemaなしドライバーリダイレクト
twitterOAuthCallbackRouteGET / HTTP/auth/oauth/twitter/callbackなしなし302 リダイレクト

詳細

googleOAuthRoute

実装

エンドポイント: GET /auth/oauth/google

アクセス: パブリック。validators: []

リクエスト: googleOauthSchemafppurposeredirectUrl、省略可能な typeId、および省略可能な空の JSON オブジェクトを検証します。

パイプライン: requestGoogleOAuthorThrow

成功: 注入された googleOAuthDriver.request がプロバイダーリダイレクトを処理します。

失敗: AuthenticationInvalidTokenError400 にマッピングされます。

完全なソースを表示
export const googleOAuthRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(requestGoogleOAuth, [
['context', 'configuration', 'authSecrets'],
['context', 'googleOAuthDriver', 'request'],
['context', 'request'],
['context', 'response'],
['params', 'requestQuery', 'fp'],
['params', 'requestQuery', 'purpose'],
['params', 'requestQuery', 'redirectUrl'],
['params', 'requestQuery', 'typeId'],
['context', 'configuration', 'onetimeTokenSignOptions'],
]),
),
lift(withLogging(orThrow([[AuthenticationInvalidTokenError, 400]]))),
),
method: 'GET',
path: '/auth/oauth/google',
validators: [],
});

googleOAuthCallbackRoute

実装

エンドポイント: GET /auth/oauth/google/callback

アクセス: パブリック。validators: []

リクエスト: 合成されたスキーマはありません。ルートはプロバイダーのコールバックデータと requestQuery.state を直接読み取ります。

パイプライン: authenticateGoogleOAuthextractOAuthLoginState → サインアップ時のみの checkEmailIsUniqueInIdentitiesverifyGoogleOAuthgetLoginTokenTargetgetFingerprintbuildTokenVerificationgenerateOneTimeTokenstoreOneTimeTokengenerateRedirectURLredirectToorThrow

成功: redirectTo は、onetimeToken を付加したデコード済み state のリダイレクト URL に 302 を送信します。

失敗: 無効なトークン/入力は 400、アイデンティティなしは 404、データベース失敗は 500 です。Result の前に発生したドライバー例外はサービスのエラーハンドラーへ伝播します。

完全なソースを表示
export const googleOAuthCallbackRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
authenticateGoogleOAuth,
[
['context', 'googleOAuthDriver', 'callback'],
['context', 'request'],
['context', 'response'],
],
'profile',
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
extractOAuthLoginState,
[
['context', 'configuration', 'authSecrets'],
['params', 'requestQuery', 'state'],
],
'loginState',
),
),
),
flatMapAsync(
ifElse(
(input: RouteHandlerPayload) => input?.context?.data?.loginState?.purpose === OAUTH_SIGNUP,
withLogging(
applyPayloadArgs(
checkEmailIsUniqueInIdentities,
[
['context', 'db', 'identities'],
['context', 'data', 'profile', 'email'],
],
'isEmailUnique',
),
),
async input => ok(input),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
verifyGoogleOAuth,
[
['context', 'db', 'identities'],
['context', 'data', 'loginState'],
['context', 'data', 'profile'],
],
'identityId',
),
),
),
flatMapAsync(applyPayloadArgs(getLoginTokenTarget, [], 'target')),
flatMapAsync(withLogging(applyPayloadArgs(getFingerprint, [['context', 'request', 'headers']], 'fingerprint'))),
flatMapAsync(
withLogging(
applyPayloadArgs(
buildTokenVerification,
[
['context', 'request'],
['context', 'data', 'target'],
['context', 'data', 'fingerprint'],
],
'tokenVerification',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
generateOneTimeToken,
[
['context', 'configuration', 'authSecrets'],
['context', 'configuration', 'onetimeTokenSignOptions'],
['context', 'data', 'tokenVerification'],
['context', 'data', 'identityId'],
],
'token',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
storeOneTimeToken,
[
['context', 'db', 'onetimetokens'],
['context', 'data', 'token'],
],
'isStoredOneTimeToken',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
generateRedirectURL,
[
['context', 'data', 'token'],
['context', 'data', 'loginState', 'redirectUrl'],
],
'redirectUrl',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(redirectTo, [
['context', 'response'],
['context', 'data', 'redirectUrl'],
]),
),
),
lift(
withLogging(
orThrow([
[AuthenticationInvalidTokenError, 400],
[AuthenticationInvalidInputError, 400],
[AuthenticationNotFoundError, 404],
[AuthenticationUnexpectedDBError, 500],
]),
),
),
),
method: 'GET',
path: '/auth/oauth/google/callback',
validators: [],
});

lineOAuthRoute

実装

エンドポイント: GET /auth/oauth/line

アクセス: パブリック。validators: []

リクエスト: lineOauthSchemafppurposeredirectUrl、省略可能な typeId、および省略可能な空の JSON オブジェクトを検証します。

パイプライン: requestLineOAuthorThrow

成功: 注入された lineOAuthDriver.request がプロバイダーリダイレクトを処理します。

失敗: orThrow([]) には明示的なソースエラーマッピングがありません。

完全なソースを表示
export const lineOAuthRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
requestLineOAuth,
[
['context', 'configuration', 'authSecrets'],
['context', 'lineOAuthDriver', 'request'],
['context', 'request'],
['context', 'response'],
['params', 'requestQuery', 'fp'],
['params', 'requestQuery', 'purpose'],
['params', 'requestQuery', 'redirectUrl'],
['params', 'requestQuery', 'typeId'],
['context', 'configuration', 'onetimeTokenSignOptions'],
],
'state',
),
),
lift(withLogging(orThrow([]))),
),
method: 'GET',
path: '/auth/oauth/line',
validators: [],
});

lineOAuthCallbackRoute

実装

エンドポイント: GET /auth/oauth/line/callback

アクセス: パブリック。validators: []

リクエスト: 合成されたスキーマはありません。プロバイダーのコールバックデータと requestQuery.state を読み取ります。

パイプライン: authenticateLineOAuthextractOAuthLoginStateverifyLineOAuthgetLoginTokenTargetgetFingerprintbuildTokenVerificationgenerateOneTimeTokenstoreOneTimeTokengenerateRedirectURLredirectToorThrow

成功: 生成された onetimeToken を含む 302 リダイレクト。

失敗: 入力は 400、アイデンティティなしは 404、データベースまたは OAuth エラーは 500 です。スローされたドライバーコールバックは Result ラッパーをバイパスします。

完全なソースを表示
export const lineOAuthCallbackRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
authenticateLineOAuth,
[
['context', 'lineOAuthDriver', 'callback'],
['context', 'request'],
['context', 'response'],
],
'profile',
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
extractOAuthLoginState,
[
['context', 'configuration', 'authSecrets'],
['params', 'requestQuery', 'state'],
],
'loginState',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
verifyLineOAuth,
[
['context', 'db', 'identities'],
['context', 'data', 'loginState'],
['context', 'data', 'profile'],
],
'identityId',
),
),
),
flatMapAsync(applyPayloadArgs(getLoginTokenTarget, [], 'target')),
flatMapAsync(withLogging(applyPayloadArgs(getFingerprint, [['context', 'request', 'headers']], 'fingerprint'))),
flatMapAsync(
withLogging(
applyPayloadArgs(
buildTokenVerification,
[
['context', 'request'],
['context', 'data', 'target'],
['context', 'data', 'fingerprint'],
],
'tokenVerification',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
generateOneTimeToken,
[
['context', 'configuration', 'authSecrets'],
['context', 'configuration', 'onetimeTokenSignOptions'],
['context', 'data', 'tokenVerification'],
['context', 'data', 'identityId'],
],
'token',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
storeOneTimeToken,
[
['context', 'db', 'onetimetokens'],
['context', 'data', 'token'],
],
'isStoredOneTimeToken',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
generateRedirectURL,
[
['context', 'data', 'token'],
['context', 'data', 'loginState', 'redirectUrl'],
],
'redirectUrl',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(redirectTo, [
['context', 'response'],
['context', 'data', 'redirectUrl'],
]),
),
),
lift(
withLogging(
orThrow([
[AuthenticationInvalidInputError, 400],
[AuthenticationNotFoundError, 404],
[AuthenticationUnexpectedDBError, 500],
[AuthenticationOAuthError, 500],
]),
),
),
),
method: 'GET',
path: '/auth/oauth/line/callback',
validators: [],
});

twitterOAuthRoute

実装

エンドポイント: GET /auth/oauth/twitter

アクセス: パブリック。validators: []

リクエスト: twitterOauthSchemapurposeredirectUrl、省略可能な typeId、および省略可能な空の JSON オブジェクトを検証します。

パイプライン: prepareTwitterCallbackStaterequestTwitterOAuthorThrow

成功: 注入された twitterOAuthDriver.request がプロバイダーリダイレクトを処理します。

失敗: orThrow([]) には明示的なソースエラーマッピングがありません。

完全なソースを表示
export const twitterOAuthRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
prepareTwitterCallbackState,
[
['params', 'requestQuery', 'purpose'],
['params', 'requestQuery', 'redirectUrl'],
['params', 'requestQuery', 'typeId'],
],
'state',
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(requestTwitterOAuth, [
['context', 'twitterOAuthDriver', 'request'],
['context', 'request'],
['context', 'response'],
['context', 'data', 'state'],
]),
),
),
lift(withLogging(orThrow([]))),
),
method: 'GET',
path: '/auth/oauth/twitter',
validators: [],
});

twitterOAuthCallbackRoute

実装

エンドポイント: GET /auth/oauth/twitter/callback

アクセス: パブリック。validators: []

リクエスト: 合成されたスキーマはありません。Twitter のドライバーがコールバック state を提供します。

パイプライン: authenticateTwitterOAuthverifyTwitterOAuthgetLoginTokenTargetgetFingerprintbuildTokenVerificationgenerateOneTimeTokenstoreOneTimeTokengenerateRedirectURLredirectToorThrow

成功: 生成された onetimeToken を含む 302 リダイレクト。

失敗: 入力は 400、アイデンティティなしは 404、データベース/OAuth の失敗は 500 です。

完全なソースを表示
export const twitterOAuthCallbackRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
authenticateTwitterOAuth,
[
['context', 'twitterOAuthDriver', 'callback'],
['context', 'request'],
['context', 'response'],
],
'callbackResult',
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
verifyTwitterOAuth,
[
['context', 'db', 'identities'],
['context', 'data', 'callbackResult', 'state', 'purpose'],
['context', 'data', 'callbackResult', 'state', 'typeId'],
['context', 'data', 'callbackResult', 'user'],
],
'identityId',
),
),
),
flatMapAsync(applyPayloadArgs(getLoginTokenTarget, [], 'target')),
flatMapAsync(withLogging(applyPayloadArgs(getFingerprint, [['context', 'request', 'headers']], 'fingerprint'))),
flatMapAsync(
withLogging(
applyPayloadArgs(
buildTokenVerification,
[
['context', 'request'],
['context', 'data', 'target'],
['context', 'data', 'fingerprint'],
],
'tokenVerification',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
generateOneTimeToken,
[
['context', 'configuration', 'authSecrets'],
['context', 'configuration', 'onetimeTokenSignOptions'],
['context', 'data', 'tokenVerification'],
['context', 'data', 'identityId'],
],
'token',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
storeOneTimeToken,
[
['context', 'db', 'onetimetokens'],
['context', 'data', 'token'],
],
'isStoredOneTimeToken',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
generateRedirectURL,
[
['context', 'data', 'token'],
['context', 'data', 'callbackResult', 'state', 'redirectUrl'],
],
'redirectUrl',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(redirectTo, [
['context', 'response'],
['context', 'data', 'redirectUrl'],
]),
),
),
lift(
withLogging(
orThrow([
[AuthenticationInvalidInputError, 400],
[AuthenticationNotFoundError, 404],
[AuthenticationUnexpectedDBError, 500],
[AuthenticationOAuthError, 500],
]),
),
),
),
method: 'GET',
path: '/auth/oauth/twitter/callback',
validators: [],
});