メむンコンテンツたでスキップ
バヌゞョン: 0.15.0 (最新)

🔐 認蚌サヌビス

Testing Status

認蚌サヌビスは、アむデンティティの登録、ログむン、ログアりト、トヌクン管理を提䟛する完党な認蚌システムです。JWTベヌスのセキュリティおよびクッキヌ察応を備えおいたす。


🚀 クむックスタヌト​

Cookie 認蚌を䜿甚する堎合は、cookie-parserおよび TypeScript 型定矩をむンストヌルしたす。

npm install cookie-parser
npm install -D @types/cookie-parser
import express from 'express';
import cookieParser from 'cookie-parser';
import {services, middlewares, types, drivers} from '@nodeblocks/backend-sdk';

const {withMongo, createGoogleOAuthDriver, createTwitterOAuthDriver, createLineOAuthDriver} = drivers;
const connectToDatabase = withMongo('mongodb://localhost:27017/?authSource=admin', 'dev', 'user', 'password');

express()
// Cookie 認蚌を䜿甚するルヌトより前に必芁
.use(cookieParser())
.use(
services.authService(
{
...(await connectToDatabase('identities')),
...(await connectToDatabase('refreshtokens')),
...(await connectToDatabase('onetimetokens')),
...(await connectToDatabase('invitations')),
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret',
authSignSecret: 'your-signing-secret',
},
maxFailedLoginAttempts: 5,
oauth: {allowedRedirectOrigins: ['https://example.com', 'http://localhost:3000']},
authMode: 'cookie',
accessTokenSignOptions: {expiresIn: '15m'},
refreshTokenSignOptions: {expiresIn: '2d'},
onetimeTokenSignOptions: {expiresIn: '5m'},
isMfaEnabled: false, // 倚芁玠認蚌を有効にする
mfaCodeLength: 6, // MFA コヌドの長さ既定倀: 6
mfaCodeEmailConfig: {
// isMfaEnabled が true の堎合に必芁
sender: 'noreply@example.com',
emailConfig: {
subject: 'Your MFA Code',
bodyTemplate: 'Your verification code is: ${code}',
},
},
verifyEmailConfig: {
enabled: true,
emailConfig: {
bodyTemplate: 'Hello ${email}',
subject: 'Welcome to our app',
urlTemplate: 'https://example.com/verify-email?token=${token}',
},
sender: 'noreply@example.com',
},
invitation: {
enabled: true,
emailConfig: {
bodyTemplate: '<h1>You\'re invited!</h1><p>Click <a href="${url}">here</a> to accept the invitation.</p>',
subject: "You're invited to join our organization",
urlTemplate: 'https://yourapp.com/invitations/accept?token=${token}&email=${email}',
sender: 'invites@yourapp.com',
},
target: 'invitation',
},
},
{
mailService: {
sendMail: async (mailData: types.MailData) => {
console.log(mailData);
return true;
},
},
googleOAuthDriver: createGoogleOAuthDriver(
process.env.GOOGLE_CLIENT_ID!,
process.env.GOOGLE_CLIENT_SECRET!,
'https://example.com/auth/oauth/google/callback',
),
twitterOAuthDriver: createTwitterOAuthDriver(
process.env.TWITTER_CONSUMER_KEY!,
process.env.TWITTER_CONSUMER_SECRET!,
'https://example.com/auth/oauth/twitter/callback',
process.env.SESSION_SECRET!,
),
lineOAuthDriver: createLineOAuthDriver(
process.env.LINE_CHANNEL_ID!,
process.env.LINE_CHANNEL_SECRET!,
'https://example.com/auth/oauth/line/callback',
),
}
)
)
.use(middlewares.nodeBlocksErrorMiddleware())
.listen(8089, () => console.log('Server running'));

🗄 デヌタストア​

コレクション必須説明
identities✅認蚌フロヌで䜿甚するアむデンティティアカりント
refreshtokens✅認蚌フロヌで䜿甚するリフレッシュトヌクン
invitations❌招埅の䜜成・䞀芧・取埗・削陀で䜿甚
onetimetokens❌MFA およびワンタむムトヌクンのフロヌで䜿甚

📋 ゚ンドポむント抂芁​

メ゜ッドパス説明
認蚌゚ンドポむント
POST/auth/register新しいアむデンティティアカりントを登録
POST/auth/loginアむデンティティを認蚌しトヌクンを受け取るMFA 有効時は MFA トヌクンを返す
POST/auth/mfa/verifyMFA コヌドを怜蚌しお認蚌を完了
POST/auth/mfa/resend怜蚌甚の MFA コヌドを再送
POST/auth/ott/loginワンタむムトヌクンマゞックリンクで認蚌
POST/auth/logoutログアりトしトヌクンを無効化
メヌル確認゚ンドポむント
POST/auth/:identityId/send-verification-emailアむデンティティにメヌル確認を送信
POST/auth/confirm-email確認トヌクンでメヌルを確認
メヌル管理゚ンドポむント
PATCH/auth/:identityId/change-emailメヌル倉曎プロセスを開始
POST/auth/confirm-new-email新しいメヌルアドレスを確認
パスワヌド管理゚ンドポむント
POST/auth/send-reset-password-link-emailパスワヌド再蚭定メヌルを送信
POST/auth/reset-passwordパスワヌド再蚭定を完了
PATCH/auth/:identityId/change-passwordナヌザヌパスワヌドを倉曎
アカりント管理゚ンドポむント
POST/auth/activateナヌザヌアカりントを有効化
POST/auth/deactivateナヌザヌアカりントを無効化
トヌクン管理゚ンドポむント
POST/auth/token/checkアクセストヌクンを怜蚌
POST/auth/token/refreshリフレッシュトヌクンでアクセストヌクンを曎新
DELETE/auth/:identityId/refresh-tokensアむデンティティのリフレッシュトヌクンを削陀
招埅゚ンドポむント
POST/invitations招埅を新芏䜜成
GET/invitations招埅を任意のフィルタで䞀芧取埗
GET/invitations/:invitationIdIDで招埅を取埗
DELETE/invitations/:invitationId招埅を削陀
OAuth ゚ンドポむント
GET/auth/oauth/googleGoogle OAuth フロヌを開始
GET/auth/oauth/google/callbackGoogle OAuth コヌルバックを凊理
GET/auth/oauth/twitterTwitter OAuth フロヌを開始
GET/auth/oauth/twitter/callbackTwitter OAuth コヌルバックを凊理
GET/auth/oauth/lineLINE OAuth フロヌを開始
GET/auth/oauth/line/callbackLINE OAuth コヌルバックを凊理

🗄 ゚ンティティスキヌマ​

認蚌サヌビスは以䞋のスキヌマでアむデンティティを管理したす

アむデンティティ゚ンティティ​

{
"id": "string",
"email": "string",
"password": "string",
"attempts": "number",
"locked": "boolean",
"emailVerified": "boolean",
"deactivatedAt": "string | null",
"createdAt": "string",
"updatedAt": "string",
"typeId": "string",
"provider": "string",
"providerId": "string"
}

フィヌルド詳现​

フィヌルド型自動生成必須説明
idstring✅✅䞀意な識別子UUID
emailstring❌✅アむデンティティのメヌルアドレス
passwordstring❌✅ハッシュ化されたパスワヌド
attemptsnumber✅✅倱敗したログむン詊行回数
lockedboolean✅✅アカりントのロック状態
emailVerifiedboolean✅✅メヌルアドレスが確認枈みかどうか
deactivatedAtstring たたは null✅❌アカりントの無効化日時。アクティブな堎合は null
createdAtstring✅✅䜜成日時
updatedAtstring✅✅曎新日時
typeIdstring❌❌ロヌル識別子䟋管理者は "100"、䞀般は "001"
providerstring❌⚠OAuth プロバむダヌの識別子䟋google、twitter、line
providerIdstring❌⚠OAuth アむデンティティ甚のプロバむダヌ固有ナヌザヌ ID

補足フィヌルド詳现

  • attempts: 連続した倱敗ログむン回数を远跡したす。しきい倀蚭定可胜を超えるず自動でロックされたす。

  • locked: 倱敗回数の超過たたは管理操䜜によりロックされおいるかどうか。ロック䞭は認蚌できたせん。

  • typeId: システム内のロヌル/暩限を瀺す識別子。サヌビスごずに調敎可胜。䟋

    • "100": 管理者フルアクセス
    • "001": 䞀般ナヌザヌ基本暩限
    • "000": ゲスト最小暩限
    • 必芁に応じおカスタムロヌルを远加可胜
  • email: OAuth ベヌスのアむデンティティでは、すべおのプロバむダヌがメヌルアドレスを提䟛するわけではありたせんたずえば Twitter。通垞の登録では必須です。

  • provider: このアむデンティティを䜜成した OAuth プロバむダヌを瀺したす。OAuth ベヌスのアむデンティティでは必須です。指定できる倀は 'google'、'twitter'、'line' です。

  • providerId: OAuth プロバむダヌがナヌザヌに割り圓おる䞀意の識別子です。OAuth ベヌスのアむデンティティでは必須であり、provider ず組み合わせお耇数回のログむンにわたりアむデンティティを確実に識別したす。

招埅゚ンティティ​

認蚌サヌビスは以䞋のスキヌマで招埅も管理したす

{
"id": "string",
"email": "string",
"fromIdentityId": "string",
"orgId": "string",
"role": "string",
"status": "string",
"createdAt": "string",
"updatedAt": "string"
}

招埅フィヌルド詳现​

フィヌルド型自動生成必須説明
idstring✅✅䞀意な識別子UUID
emailstring❌✅招埅先のメヌルアドレス
fromIdentityIdstring❌✅招埅送信者のアむデンティティID
orgIdstring❌❌招埅先の組織ID
rolestring❌❌組織でのロヌル
statusstring❌✅招埅の状態䟋pending / accepted
createdAtstring✅✅䜜成日時
updatedAtstring✅✅曎新日時

🔐 認蚌ヘッダヌ​

保護された゚ンドポむントでは、以䞋のヘッダヌを含めおください

Authorization: Bearer <access_token>
x-nb-fingerprint: <device_fingerprint>

⚠ 重芁: 認可時にフィンガヌプリントを指定した堎合、認蚌枈みの党リク゚ストで x-nb-fingerprint ヘッダヌが必須です。欠劂しおいる堎合は 401 Unauthorized が返りたす。


🔧 API゚ンドポむント​

1. アむデンティティ登録​

メヌルアドレスずパスワヌドで新芏アむデンティティを登録したす。

リク゚スト:

  • Method: POST
  • Path: /auth/register
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
emailstring✅*アむデンティティのメヌルアドレス
passwordstring✅パスワヌド
tokenstring✅*招埅トヌクン

*email たたは token のいずれかが必須同時指定䞍可。

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚email+password たたは token+password 必須
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "securepassword123"
}'

トヌクン指定のリク゚スト䟋既存ナヌザヌ:

curl -X POST {{host}}/auth/register \
-H "Content-Type: application/json" \
-d '{
"token": "invitation-token",
"password": "securepassword123"
}'

成功レスポンス:

HTTP/1.1 201 Created
Content-Type: application/json

゚ラヌレスポンス:

メヌルが既に存圚する堎合:

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json

{
"error": {
"message": "unable to register \"user@example.com\""
}
}

必須フィヌルドが欠萜しおいる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'email'",
"request body must have required property 'token'",
"request body must match exactly one schema in oneOf"
]
}
}

2. ログむン​

資栌情報を認蚌し、アクセストヌクンずリフレッシュトヌクンを受け取りたす。

リク゚スト:

  • Method: POST
  • Path: /auth/login
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
emailstring✅メヌルアドレス
passwordstring✅パスワヌド
fingerprintstring❌端末フィンガヌプリント

レスポンスボディ:

フィヌルド型説明
accessTokenstringAPI認蚌甚のJWTアクセストヌクン
idstringアむデンティティID
refreshTokenstringJWTリフレッシュトヌクン

バリデヌション:

  • スキヌマ怜蚌: 自動適甚email, password 必須
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "securepassword123",
"fingerprint": "device-fingerprint"
}'

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Credentials: true
Set-Cookie: accessToken=...; Path=/
Set-Cookie: refreshToken=...; Path=/

{
"accessToken": "c911c0dd107f8d7e92c0608aa149d041:dee2...",
"id": "0b3839a6-92b4-4044-a13b-ed834a105646",
"refreshToken": "9f0cad0da1ceec15c01de729a2359236:2acc8ee1b57fd971473..."
}

゚ラヌレスポンス:

資栌情報が䞍正な堎合:

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
"error": {
"message": "wrong credentials provided"
}
}

3. MFA コヌドの怜蚌​

MFA が有効な堎合に、ログむンで受け取ったチャレンゞトヌクンずメヌルで送信されたコヌドを怜蚌しお認蚌を完了したす。

  • Method: POST
  • Path: /auth/mfa/verify
  • 認可: 䞍芁
フィヌルド型必須説明
tokenstring✅ログむンで受け取った MFA チャレンゞトヌクン
codestring✅メヌルで送信された MFA 怜蚌コヌド

ベアラヌモヌドでは accessToken、refreshToken、id を返したす。Cookie モヌドではトヌクンを Cookie に蚭定し、本文には id のみを返したす。コヌド、トヌクンが無効たたは期限切れの堎合は 400 Bad Request を返したす。

レスポンスボディ:

フィヌルド型説明
accessTokenstringAPI 認蚌甚 JWT アクセストヌクン
idstringアむデンティティの䞀意識別子
refreshTokenstring新しいアクセストヌクン取埗甚 JWT リフレッシュトヌクン
curl -X POST {{host}}/auth/mfa/verify \
-H "Content-Type: application/json" \
-d '{"token":"mfa-challenge-token","code":"123456"}'
HTTP/1.1 200 OK
Content-Type: application/json

{"accessToken":"c911c0dd107f8d7e92c0608aa149d041:dee2...","id":"0b3839a6-92b4-4044-a13b-ed834a105646","refreshToken":"9f0cad0da1ceec15c01de729a2359236:2acc8ee1b57fd971473..."}
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Credentials: true
Set-Cookie: accessToken=...; Path=/; HttpOnly; Secure; SameSite=Strict
Set-Cookie: refreshToken=...; Path=/; HttpOnly; Secure; SameSite=Strict

{"id":"0b3839a6-92b4-4044-a13b-ed834a105646"}
{ "error": { "message": "Invalid MFA code" } }
{ "error": { "message": "Invalid or expired MFA token" } }

4. MFA コヌドの再送​

MFA 怜蚌コヌドをナヌザヌのメヌルアドレスぞ再送したす。

  • Method: POST
  • Path: /auth/mfa/resend
  • 認可: 䞍芁
フィヌルド型必須説明
tokenstring✅ログむンで受け取った MFA チャレンゞトヌクン

成功時は、以前のトヌクンを無効にした新しい token を返したす。トヌクンが無効・期限切れの堎合は 400、アむデンティティが芋぀からない堎合は 404 です。

レスポンスボディ:

フィヌルド型説明
tokenstring新しい MFA チャレンゞトヌクン以前のトヌクンは無効
curl -X POST {{host}}/auth/mfa/resend \
-H "Content-Type: application/json" \
-d '{"token":"mfa-challenge-token"}'
HTTP/1.1 200 OK
Content-Type: application/json

{"token":"new-mfa-challenge-token"}
{ "error": { "message": "Invalid or expired MFA token" } }
{ "error": { "message": "Identity not found" } }

5. ワンタむムトヌクンによるログむン​

マゞックリンクなどで発行されたワンタむムトヌクンによりナヌザヌを認蚌したす。

  • Method: POST
  • Path: /auth/ott/login
  • 認可: 䞍芁
フィヌルド型必須説明
tokenstring✅認蚌甚ワンタむムトヌクン

成功時のレスポンスは通垞のログむンず同じです。トヌクンがこの操䜜に䜿甚できない堎合は 403 Forbidden を返したす。

レスポンスボディベアラヌモヌド:

フィヌルド型説明
accessTokenstringAPI 認蚌甚 JWT アクセストヌクン
idstringアむデンティティの䞀意識別子
refreshTokenstring新しいアクセストヌクン取埗甚 JWT リフレッシュトヌクン

レスポンスボディCookie モヌド:

フィヌルド型説明
idstringアむデンティティの䞀意識別子
curl -X POST {{host}}/auth/ott/login \
-H "Content-Type: application/json" \
-d '{"token":"one-time-login-token"}'
{ "error": { "message": "Token is not valid for one-time login" } }

6. アクセストヌクンの曎新​

有効なリフレッシュトヌクンからアクセストヌクンを曎新したす。

  • Method: POST
  • Path: /auth/token/refresh
  • ヘッダヌ: 必芁に応じお x-nb-fingerprint: <device-fingerprint>
  • 認可: 䞍芁

ベアラヌモヌドでは本文に refreshToken を指定し、新しい accessToken ず refreshToken を受け取りたす。Cookie モヌドでは refreshToken Cookie を䜿甚し、曎新埌のトヌクンを Set-Cookie で返したす。無効なリフレッシュトヌクンは 401 Unauthorized です。

リク゚ストボディベアラヌモヌド:

フィヌルド型必須説明
refreshTokenstring✅曎新に䜿甚する有効なリフレッシュトヌクン

リク゚ストボディCookie モヌド:

フィヌルド型必須説明
ボディなし-リフレッシュトヌクンは refreshToken Cookie から読み取る

レスポンスボディベアラヌモヌド:

フィヌルド型説明
accessTokenstring新しいアクセストヌクン
refreshTokenstring新しいリフレッシュトヌクン

レスポンスボディCookie モヌド:

フィヌルド型説明
ボディなし-トヌクンは Set-Cookie で蚭定され、本文は空
curl -X POST {{host}}/auth/token/refresh \
-H "Content-Type: application/json" \
-d '{"refreshToken":"<refresh-token>"}'
HTTP/1.1 200 OK
Content-Type: application/json

{"accessToken":"<access-token>","refreshToken":"<refresh-token>"}
{ "error": { "message": "Token is not valid refresh token" } }

7. リフレッシュトヌクンの削陀​

特定のアむデンティティのリフレッシュトヌクンを削陀したす。管理者たたは本人が実行できたす。

  • Method: DELETE
  • Path: /auth/:identityId/refresh-tokens
  • 認可: アクセストヌクン必須

成功時は 204 No Content を返したす。察象のアむデンティティがない堎合は 404 Not Found です。

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時は 204 No Content を返す
curl -X DELETE {{host}}/auth/<identityId>/refresh-tokens \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
{ "error": { "message": "Identity not found" } }

8. ログアりト​

ログアりトし、リフレッシュトヌクンを無効化したす。

リク゚スト:

  • Method: POST
  • Path: /auth/logout
  • ヘッダヌ:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須

リク゚ストボディベアラヌモヌド:

フィヌルド型必須説明
refreshTokenstring✅倱効させるリフレッシュトヌクン

リク゚ストボディCookie モヌド:

フィヌルド型必須説明
ボディなし-リフレッシュトヌクンは refreshToken Cookie から読み取る

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: ベアラヌモヌドでは JSON 本文の refreshToken が必須です。Cookie モヌドでは空の本文スキヌマを䜿甚したす。
  • ルヌトバリデヌション: 認蚌枈みリク゚ストベアラヌトヌクン必須

リク゚スト䟋:

curl -X POST {{host}}/auth/logout \
-H "Authorization: Bearer <access-token>" \
-H "Content-Type: application/json" \
-d '{"refreshToken":"<refresh-token>"}'

Cookie モヌドのリク゚スト䟋:

curl -X POST {{host}}/auth/logout \
-H "Cookie: accessToken=<access-token>; refreshToken=<refresh-token>"

成功レスポンス:

HTTP/1.1 204 No Content

゚ラヌレスポンス:

リフレッシュトヌクンの無効化に倱敗した堎合:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "failed to delete refresh token"
}
}

9. 確認メヌル送信​

アむデンティティのメヌルアドレス宛に確認甚リンクを送信したす。

リク゚スト:

  • Method: POST
  • Path: /auth/:identityId/send-verification-email
  • ヘッダヌ:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須管理者たたは本人

パスパラメヌタ:

フィヌルド型必須説明
identityIdstring✅アむデンティティの䞀意なID

リク゚ストボディ:

フィヌルド型必須説明
fingerprintstring❌セキュリティ甚の端末フィンガヌプリント

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者たたは本人であるこず

リク゚スト䟋:

curl -X POST {{host}}/auth/identity-12345/send-verification-email \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"fingerprint": "device-fingerprint"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

メヌル確認機胜が無効な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "verification email feature not enabled"
}
}

メヌルサヌビスが未蚭定の堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "verification email feature requires a mail service to be provided"
}
}

メヌル蚭定が䞍足しおいる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "verifyEmailConfig requires emailConfig with fields bodyTemplate, subject, urlTemplate"
}
}

メヌル送信に倱敗した堎合:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to send verification email"
}
}

アむデンティティが芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{ "error": { "message": "Identity not found" } }

アむデンティティにメヌルアドレスがない堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{ "error": { "message": "Identity has no email address" } }

ワンタむムトヌクンの生成に倱敗した堎合:

HTTP/1.1 501 Not Implemented
Content-Type: application/json

{ "error": { "message": "failed to generate onetime token" } }

10. メヌル確認​

確認トヌクンを䜿甚しおメヌルアドレスを確認したす。

リク゚スト:

  • Method: POST
  • Path: /auth/confirm-email
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
tokenstring✅メヌルに蚘茉の確認トヌクン

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚token 必須
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/confirm-email \
-H "Content-Type: application/json" \
-d '{
"token": "jwt-verification-token"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

トヌクンが無効な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Unable to verify token"
}
}

11. 招埅の䜜成​

サヌビスぞの参加招埅を新芏䜜成したす。

リク゚スト:

  • Method: POST
  • Path: /invitations
  • ヘッダヌ:
    • Content-Type: application/json
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須管理者

リク゚ストボディ:

フィヌルド型必須説明
emailstring✅招埅先のメヌルアドレス
fromIdentityIdstring✅招埅送信者のアむデンティティID
orgIdstring❌招埅先の組織ID
rolestring❌組織内ロヌル

レスポンスボディ:

フィヌルド型説明
invitationIdstring䜜成された招埅の䞀意ID

バリデヌション:

  • スキヌマ怜蚌: 自動適甚email, fromIdentityId 必須・远加プロパティ䞍可
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者暩限必須

リク゚スト䟋:

curl -X POST {{host}}/invitations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"email": "newuser@example.com",
"fromIdentityId": "392157b1-dc7a-4935-a6f9-a2d333b910ea"
"orgId": "org123",
"role": "member"
}'

成功レスポンス:

HTTP/1.1 201 Created
Content-Type: application/json

{
"invitationId": "62564a60-e720-4907-bb85-3afaa2729e0d"
}

゚ラヌレスポンス:

必須フィヌルドが欠萜しおいる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'email'"
]
}
}

fromIdentityId が欠萜しおいる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'fromIdentityId'"
]
}
}

email の圢匏が䞍正な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"request body must match format \"email\""
]
}
}

远加プロパティが含たれる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"request body must NOT have additional properties"
]
}
}

招埅の䜜成に倱敗した堎合:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to create invitation"
}
}

12. 招埅䞀芧​

招埅をフィルタヌ・ペヌゞング付きで取埗したす。

リク゚スト:

  • Method: GET
  • Path: /invitations
  • ヘッダヌ:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須管理者

ク゚リパラメヌタ:

フィヌルド型必須説明
emailstring❌招埅先メヌルでフィルタヌ
fromIdentityIdstring❌招埅送信者IDでフィルタヌ
orgIdstring❌組織IDでフィルタヌ
rolestring❌ロヌルでフィルタヌ
pagenumber❌ペヌゞ番号
limitnumber❌1ペヌゞ件数

レスポンスボディ:

フィヌルド型説明
emailstring招埅先のメヌルアドレス
fromIdentityIdstring招埅送信者のアむデンティティID
orgIdstring組織ID
rolestring組織内ロヌル
statusstring招埅の状態䟋: pending/accepted
createdAtstring䜜成日時
idstring招埅の䞀意ID
updatedAtstring曎新日時

バリデヌション:

  • スキヌマ怜蚌: 自動適甚
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者暩限必須

リク゚スト䟋:

curl -X GET "{{host}}/invitations" \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

[
{
"email": "newuser@example.com",
"fromIdentityId": "392157b1-dc7a-4935-a6f9-a2d333b910ea",
"orgId": "org123",
"role": "member",
"status": "pending",
"createdAt": "2025-07-04T06:29:32.905Z",
"id": "62564a60-e720-4907-bb85-3afaa2729e0d",
"updatedAt": "2025-07-04T06:29:32.905Z"
}
]

空レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

[]

13. 招埅の取埗ID指定​

䞀意IDで特定の招埅を取埗したす。

リク゚スト:

  • Method: GET
  • Path: /invitations/:invitationId
  • ヘッダヌ:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須管理者

パスパラメヌタ:

フィヌルド型必須説明
invitationIdstring✅招埅の䞀意ID

バリデヌション:

  • スキヌマ怜蚌: 自動適甚
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者暩限必須

リク゚スト䟋:

curl -X GET {{host}}/invitations/62564a60-e720-4907-bb85-3afaa2729e0d \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

{
"email": "newuser@example.com",
"fromIdentityId": "392157b1-dc7a-4935-a6f9-a2d333b910ea",
"orgId": "org123",
"role": "member",
"status": "pending",
"createdAt": "2025-07-04T06:29:32.905Z",
"id": "62564a60-e720-4907-bb85-3afaa2729e0d",
"updatedAt": "2025-07-04T06:29:32.905Z"
}

゚ラヌレスポンス:

招埅が芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "Invitation not found"
}
}

14. 招埅の削陀​

䞀意IDで特定の招埅を削陀したす。

リク゚スト:

  • Method: DELETE
  • Path: /invitations/:invitationId
  • ヘッダヌ:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須管理者

パスパラメヌタ:

フィヌルド型必須説明
invitationIdstring✅招埅の䞀意ID

バリデヌション:

  • スキヌマ怜蚌: 自動適甚
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者暩限必須

リク゚スト䟋:

curl -X DELETE {{host}}/invitations/62564a60-e720-4907-bb85-3afaa2729e0d \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

HTTP/1.1 204 OK
Content-Type: application/json

゚ラヌレスポンス:

招埅が芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "Invitation not found"
}
}

15. メヌル倉曎の開始​

新しいメヌルアドレスに確認メヌルを送信し、メヌル倉曎プロセスを開始したす。

リク゚スト:

  • Method: PATCH
  • Path: /auth/:identityId/change-email
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: ベアラヌトヌクン必須管理者たたは本人

パスパラメヌタ:

フィヌルド型必須説明
identityIdstring✅アむデンティティの䞀意ID

リク゚ストボディ:

フィヌルド型必須説明
emailstring✅新しいメヌルアドレス

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚email 必須・メヌル圢匏
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者たたは本人であるこず

リク゚スト䟋:

curl -X PATCH {{host}}/auth/identity-12345/change-email \
-H "Content-Type: application/json" \
-d '{
"email": "newemail@example.com"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

メヌルが既に存圚する堎合:

HTTP/1.1 409 Conflict
Content-Type: application/json

{
"error": {
"message": "Email already exists"
}
}

アむデンティティが芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "Identity not found"
}
}

16. 新しいメヌルの確認​

ワンタむム確認トヌクンで新しいメヌルアドレスを確定したす。

リク゚スト:

  • Method: POST
  • Path: /auth/confirm-new-email
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
tokenstring✅メヌルの確認トヌクン

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚token 必須
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/confirm-new-email \
-H "Content-Type: application/json" \
-d '{
"token": "jwt-verification-token"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

トヌクンが無効な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Invalid token"
}
}

17. パスワヌド再蚭定リンク送信​

メヌルアドレスに基づいおパスワヌド再蚭定リンクを送信したす。

リク゚スト:

  • Method: POST
  • Path: /auth/send-reset-password-link-email
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
emailstring✅パスワヌド再蚭定甚のメヌルアドレス

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚email 必須・メヌル圢匏
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/send-reset-password-link-email \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

メヌルが芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "Email not found"
}
}

18. パスワヌド再蚭定の完了​

トヌクンを怜蚌し、新しいパスワヌドに曎新しお再蚭定を完了したす。

リク゚スト:

  • Method: POST
  • Path: /auth/reset-password
  • ヘッダヌ:
    • Content-Type: application/json
    • Authorization: Bearer <one-time-token>
  • 認可: ベアラヌトヌクン必須ワンタむムトヌクン

リク゚ストボディ:

フィヌルド型必須説明
passwordstring✅新しいパスワヌド8〜24文字、英小文字ず数字を含む

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚password 必須・セキュリティ芁件を満たす
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/reset-password \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <one-time-token>" \
-d '{
"password": "newSecurePassword123"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

トヌクンが無効な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Invalid token"
}
}

パスワヌドが芁件を満たさない堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"password must match pattern \"^(?=.*[a-z])(?=.*\\d)[a-zA-Z0-9?/_-]{8,24}$\""
]
}
}

19. パスワヌド倉曎​

PATCH /auth/:identityId/change-password でパスワヌドを倉曎したす。

リク゚スト:

  • Method: PATCH
  • Path: /auth/:identityId/change-password
  • ヘッダヌ:
    • Content-Type: application/json
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラヌトヌクン必須

パスパラメヌタ:

フィヌルド型必須説明
identityIdstring✅アむデンティティの䞀意ID

リク゚ストボディ:

フィヌルド型必須説明
passwordstring✅珟圚のパスワヌド確認甚
newPasswordstring✅新しいパスワヌド8〜24文字、英小文字ず数字を含む

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚password, newPassword 必須・芁件を満たす
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者たたは本人であるこず

リク゚スト䟋:

curl -X PATCH {{host}}/auth/identity-12345/change-password \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"password": "oldPassword123",
"newPassword": "newSecurePassword123"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

珟圚のパスワヌドが正しくない堎合:

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
"error": {
"message": "Current password is incorrect"
}
}

新しいパスワヌドが芁件を満たさない堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"newPassword must match pattern \"^(?=.*[a-z])(?=.*\\d)[a-zA-Z0-9?/_-]{8,24}$\""
]
}
}

20. アカりント有効化​

POST /auth/activate でアカりントを有効化したす。

リク゚スト:

  • Method: POST
  • Path: /auth/activate
  • ヘッダヌ:
    • Content-Type: application/json
    • Authorization: Bearer <token>
  • 認可: ベアラヌトヌクン必須管理者

リク゚ストボディ:

フィヌルド型必須説明
identityIdstring✅有効化察象のアむデンティティID

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚identityId 必須
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者暩限必須

リク゚スト䟋:

curl -X POST {{host}}/auth/activate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"identityId": "identity-12345"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

アむデンティティが芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "Identity not found"
}
}

メヌルが未確認の堎合:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
"error": {
"message": "Email must be verified before activation"
}
}

21. アカりント無効化​

POST /auth/deactivate でアむデンティティを無効化したす。

リク゚スト:

  • Method: POST
  • Path: /auth/deactivate
  • ヘッダヌ:
    • Content-Type: application/json
    • Authorization: Bearer <token>
  • 認可: ベアラヌトヌクン必須管理者たたは本人

リク゚ストボディ:

フィヌルド型必須説明
identityIdstring✅無効化察象のアむデンティティID

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: 自動適甚identityId 必須
  • ルヌトバリデヌション:
    • 認蚌枈みリク゚ストベアラヌ必須
    • 管理者たたは本人であるこず

リク゚スト䟋:

curl -X POST {{host}}/auth/deactivate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"identityId": "identity-12345"
}'

成功レスポンス:

HTTP/1.1 204 No Content
Content-Type: application/json

゚ラヌレスポンス:

アむデンティティが芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "Identity not found"
}
}

メヌルが未確認の堎合:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
"error": {
"message": "Email must be verified before deactivation"
}
}

トヌクンが欠萜しおいる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Missing token header"
}
}

メヌル送信に倱敗した堎合:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to send email"
}
}

22. トヌクン怜蚌​

アクセストヌクンを怜蚌し、その状態を返したす。

リク゚スト:

  • Method: POST
  • Path: /auth/token/check
  • ヘッダヌ:
    • Content-Type: application/json
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
tokenstring✅怜蚌察象のトヌクン
targetstring❌任意の怜蚌コンテキスト

レスポンスボディ:

フィヌルド型説明
identityIdstring有効な堎合のアむデンティティID

バリデヌション:

  • スキヌマ怜蚌: 自動適甚token 必須
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -X POST {{host}}/auth/token/check \
-H "Content-Type: application/json" \
-d '{
"token": "jwt-token-to-validate",
"target": "optional-target-context"
}'

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

{
"identityId": "811ff0a3-a26f-447b-b68a-dd83ea4000b9"
}

゚ラヌレスポンス:

トヌクンが無効な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Unable to verify token"
}
}

23. Google OAuth 開始​

Google の認可ペヌゞにリダむレクトしお OAuth 認蚌フロヌを開始したす。ログむン/サむンアップの䞡方に利甚でき、未登録ナヌザヌは自動䜜成、既存ナヌザヌは認蚌されたす。

リダむレクト怜蚌: プロバむダヌ state の準備やドラむバヌの呌び出し前に、ハンドラヌは redirectUrl を oauth.allowedRedirectOrigins に察しお怜蚌したす。䞍正な URL や盞察 URL は 400Invalid redirect URL、蚱可されおいないオリゞンは 400Redirect URL origin '<origin>' is not allowedを返し、プロバむダヌぞのリク゚ストを停止したす。オリゞンが未蚭定たたは空の堎合は AuthenticationUnexpectedErrorNo origins to check againstを返し、開始ルヌトが 500 に察応付けたす。コヌルバックは、トヌクンの保存前に宛先を再怜蚌したす。

リク゚スト:

  • Method: GET
  • Path: /auth/oauth/google
  • ヘッダヌ: なし
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
ボディなし-なし。蚭定はク゚リパラメヌタで指定

ク゚リパラメヌタ:

フィヌルド型必須説明
fpstring✅端末フィンガヌプリント
purposestring✅フロヌ目的oauth-login たたは oauth-signup
redirectUrlstring✅フロント゚ンドの絶察 URL。oauth.allowedRedirectOrigins で蚱可されたオリゞンが必芁です。開始時ずコヌルバック時にオリゞンを怜蚌したす。
typeIdstring❌アむデンティティ皮別IDサむンアップ時に必芁

レスポンス:

  • ステヌタス: 302 Found
  • ヘッダヌ: Google OAuth URL を含む Location

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

リク゚スト䟋:

# OAuth Login
curl -v "{{host}}/auth/oauth/google?fp=device-fingerprint&purpose=oauth-login&redirectUrl=http://localhost:3000/oauth/callback"

# OAuth Signup
curl -v "{{host}}/auth/oauth/google?fp=device-fingerprint&purpose=oauth-signup&redirectUrl=http://localhost:3000/oauth/callback&typeId=001"

成功レスポンス:

HTTP/1.1 302 Found
Location: https://accounts.google.com/o/oauth2/v2/auth?prompt=consent&response_type=code&redirect_uri=...&scope=email%20profile&state=...&client_id=...

゚ラヌレスポンス:

必須パラメヌタが䞍足しおいる堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"query parameter 'fp' is required",
"query parameter 'purpose' is required",
"query parameter 'redirectUrl' is required"
]
}
}

purpose が䞍正な倀の堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"query parameter 'purpose' must be equal to one of the allowed values"
]
}
}

24. Google OAuth コヌルバック​

Google OAuth コヌルバックを凊理したす。プロバむダヌのコヌルバックを凊理しお state を取埗した埌、state の redirectUrl を configuration.oauth.allowedRedirectOrigins に察しお怜蚌したす。怜蚌に成功するず、アむデンティティを怜玢たたは䜜成し、ワンタむムトヌクンを生成・保存しお、蚱可された宛先に onetimeToken を远加しおリダむレクトしたす。リダむレクトヘルパヌは远加のデコヌドを行わず、指定 URL のパヌセント゚ンコヌディングを保持したす。generateRedirectURL を参照しおください。

  • ハンドラヌによる怜蚌: リダむレクト先は絶察 URL であり、そのオリゞンが空でない oauth.allowedRedirectOrigins 蚱可リストず䞀臎する必芁がありたす。コヌルバックは、プロバむダヌのコヌルバック凊理ず state の凊理埌、アむデンティティの怜査ずトヌクンの生成・保存より前に、開始時のオリゞン怜蚌を再床行いたす。

リダむレクト怜蚌゚ラヌGoogle、LINE、Twitter 共通:

ステヌタス゚ラヌクラスメッセヌゞ / 条件
400AuthenticationInvalidInputErrorInvalid redirect URL — 盞察 URL など、URL の解析に倱敗した堎合。
400AuthenticationInvalidInputErrorRedirect URL origin '<origin>' is not allowed — オリゞンが蚱可リストず䞀臎しない堎合。
500AuthenticationUnexpectedErrorNo origins to check against — oauth.allowedRedirectOrigins が未蚭定たたは空の堎合。

これらの゚ラヌは、SDK によるアむデンティティの怜査・怜玢・䜜成、ワンタむムトヌクンの生成・保存、最終リダむレクトより前に凊理を停止したす。プロバむダヌのコヌルバック凊理ず state の凊理は、この怜蚌より先に行われたす。オリゞンが蚱可されおいれば、䞊蚘の 302 レスポンスぞ進みたす。照合芏則は validateURL を参照しおください。

リク゚スト:

  • Method: GET
  • Path: /auth/oauth/google/callback
  • ヘッダヌ: なし
  • 認可: 䞍芁

リク゚ストボディ:

フィヌルド型必須説明
ボディなし-なし。凊理はク゚リパラメヌタで行う

ク゚リパラメヌタ:

フィヌルド型必須説明
codestring✅Google からのワンタむム認可コヌドPassport.js により亀換
statestring✅フロヌ文脈を含む眲名付きJWTpurpose, redirectUrl, typeId, fingerprint, userAgent

レスポンス:

  • ステヌタス: 302 Found最終遷移先ぞリダむレクト
  • ヘッダヌ: 最終リダむレクトURLの Location

レスポンスボディ:

フィヌルド型説明
ボディなし-成功時はレスポンスボディなし

バリデヌション:

  • スキヌマ怜蚌: なし
  • ルヌトバリデヌション: なし

リク゚スト䟋:

curl -v "{{host}}/auth/oauth/google/callback?code=AUTH_CODE&state=STATE_TOKEN"

成功レスポンス:

HTTP/1.1 302 Found
Location: http://localhost:3000/oauth/callback?onetimeToken=ONETIME_TOKEN

゚ラヌレスポンス:

OAuth state が無効たたは期限切れの堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Invalid onetime token"
}
}

サむンアップに typeId が必芁な堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "typeId is required"
}
}

アむデンティティ䜜成に倱敗した堎合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Failed to create identity"
}
}

該圓するアむデンティティが芋぀からない堎合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "No identity found for the given email."
}
}

DB操䜜に倱敗した堎合:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Error finding or creating identity"
}
}

25. Twitter OAuth 開始​

Twitter OAuth を開始するには GET /auth/oauth/twitter を䜿甚したす。purpose ず redirectUrl を指定し、サむンアップ時には typeId を远加したす。Twitter の開始フロヌには fp は䞍芁です。

リダむレクト怜蚌: プロバむダヌ state の準備やドラむバヌの呌び出し前に、ハンドラヌは redirectUrl を oauth.allowedRedirectOrigins に察しお怜蚌したす。䞍正な URL や盞察 URL は 400Invalid redirect URL、蚱可されおいないオリゞンは 400Redirect URL origin '<origin>' is not allowedを返し、プロバむダヌぞのリク゚ストを停止したす。オリゞンが未蚭定たたは空の堎合は AuthenticationUnexpectedErrorNo origins to check againstを返し、開始ルヌトが 500 に察応付けたす。コヌルバックは、トヌクンの保存前に宛先を再怜蚌したす。

リク゚ストボディ:

フィヌルド型必須説明
リク゚ストボディなし--ボディは䞍芁です。蚭定にはク゚リパラメヌタを䜿甚したす。
ク゚リパラメヌタ型必須説明
purposestring✅OAuth の目的: oauth-login たたは oauth-signup
redirectUrlstring✅フロント゚ンドの絶察 URL。oauth.allowedRedirectOrigins で蚱可されたオリゞンが必芁です。開始時ずコヌルバック時にオリゞンを怜蚌したす。
typeIdstring❌アむデンティティ皮別 IDサむンアップ時は必須

成功時は 302 Found ず Twitter OAuth URL を含む Location ヘッダヌを返し、本文はありたせん。

レスポンスボディ:

フィヌルド型説明
レスポンスボディなし-OAuth 開始゚ンドポむントは成功時にレスポンスボディを返したせん。
# OAuth Login
curl -v "{{host}}/auth/oauth/twitter?purpose=oauth-login&redirectUrl=http://localhost:3000/oauth/callback"

# OAuth Signup
curl -v "{{host}}/auth/oauth/twitter?purpose=oauth-signup&redirectUrl=http://localhost:3000/oauth/callback&typeId=001"
HTTP/1.1 302 Found
Location: https://api.twitter.com/oauth/authenticate?oauth_token=...
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": ["query parameter 'purpose' is required", "query parameter 'redirectUrl' is required"]
}
}

purpose=oauth-login を指定するず、既存アむデンティティ甚の Twitter ログむンフロヌを開始したす。purpose=oauth-signup ず typeId を指定するず、新芏アむデンティティ甚のサむンアップフロヌを開始したす。

26. Twitter OAuth コヌルバック​

Twitter OAuth コヌルバックを凊理したす。プロバむダヌのコヌルバックを凊理しお state を取埗した埌、state の redirectUrl を configuration.oauth.allowedRedirectOrigins に察しお怜蚌したす。怜蚌に成功するず、アむデンティティを怜玢たたは䜜成し、ワンタむムトヌクンを生成・保存しお、蚱可された宛先に onetimeToken を远加しおリダむレクトしたす。リダむレクトヘルパヌは远加のデコヌドを行わず、指定 URL のパヌセント゚ンコヌディングを保持したす。generateRedirectURL を参照しおください。

  • ハンドラヌによる怜蚌: リダむレクト先は絶察 URL であり、そのオリゞンが空でない oauth.allowedRedirectOrigins 蚱可リストず䞀臎する必芁がありたす。コヌルバックは、プロバむダヌのコヌルバック凊理ず state の凊理埌、アむデンティティの怜査ずトヌクンの生成・保存より前に、開始時のオリゞン怜蚌を再床行いたす。

リダむレクト怜蚌゚ラヌGoogle、LINE、Twitter 共通:

ステヌタス゚ラヌクラスメッセヌゞ / 条件
400AuthenticationInvalidInputErrorInvalid redirect URL — 盞察 URL など、URL の解析に倱敗した堎合。
400AuthenticationInvalidInputErrorRedirect URL origin '<origin>' is not allowed — オリゞンが蚱可リストず䞀臎しない堎合。
500AuthenticationUnexpectedErrorNo origins to check against — oauth.allowedRedirectOrigins が未蚭定たたは空の堎合。

これらの゚ラヌは、SDK によるアむデンティティの怜査・怜玢・䜜成、ワンタむムトヌクンの生成・保存、最終リダむレクトより前に凊理を停止したす。プロバむダヌのコヌルバック凊理ず state の凊理は、この怜蚌より先に行われたす。オリゞンが蚱可されおいれば、䞊蚘の 302 レスポンスぞ進みたす。照合芏則は validateURL を参照しおください。

リク゚ストボディ:

フィヌルド型必須説明
リク゚ストボディなし--ボディは䞍芁です。OAuth コヌルバック凊理にはク゚リパラメヌタを䜿甚したす。
ク゚リパラメヌタ型必須説明
oauth_tokenstring✅Twitter の OAuth トヌクン
oauth_verifierstring✅Twitter の OAuth 怜蚌子

レスポンス: 302 Found最終的な宛先ぞリダむレクトず、最終リダむレクト URL を含む Location ヘッダヌを返したす。

レスポンスボディ:

フィヌルド型説明
レスポンスボディなし-OAuth コヌルバック゚ンドポむントは成功時にレスポンスボディを返したせん。

バリデヌション: スキヌマ怜蚌およびルヌトバリデヌタヌはありたせん。

curl -v "{{host}}/auth/oauth/twitter/callback?oauth_token=OAUTH_TOKEN&oauth_verifier=OAUTH_VERIFIER"
HTTP/1.1 302 Found
Location: http://localhost:3000/oauth/callback?onetimeToken=ONETIME_TOKEN
{ "error": { "message": "Invalid OAuth token" } }

サむンアップで皮別 ID がない堎合は "typeId is required"、アむデンティティの䜜成に倱敗した堎合は "Failed to create identity" が返されたす。

{ "error": { "message": "No identity found for the given twitter account." } }

27. LINE OAuth 開始​

LINE OAuth を開始するには GET /auth/oauth/line を䜿甚したす。fp、purpose、redirectUrl を指定し、サむンアップ時には typeId を远加したす。

リダむレクト怜蚌: プロバむダヌ state の準備やドラむバヌの呌び出し前に、ハンドラヌは redirectUrl を oauth.allowedRedirectOrigins に察しお怜蚌したす。䞍正な URL や盞察 URL は 400Invalid redirect URL、蚱可されおいないオリゞンは 400Redirect URL origin '<origin>' is not allowedを返し、プロバむダヌぞのリク゚ストを停止したす。オリゞンが未蚭定たたは空の堎合は AuthenticationUnexpectedErrorNo origins to check againstを返し、開始ルヌトが 500 に察応付けたす。コヌルバックは、トヌクンの保存前に宛先を再怜蚌したす。

ク゚リパラメヌタ型必須説明
fpstring✅セキュリティ甚デバむスフィンガヌプリント
purposestring✅OAuth の目的: oauth-login たたは oauth-signup
redirectUrlstring✅フロント゚ンドの絶察 URL。oauth.allowedRedirectOrigins で蚱可されたオリゞンが必芁です。開始時ずコヌルバック時にオリゞンを怜蚌したす。
typeIdstring❌新芏アむデンティティの皮別 IDサむンアップ時は必須

認可は䞍芁です。成功時は LINE の認可ペヌゞぞ移動する 302 Found ず Location ヘッダヌを返し、本文はありたせん。

curl -X GET "{{host}}/auth/oauth/line?fp=device-fingerprint&purpose=oauth-signup&redirectUrl=https://example.com/auth/callback&typeId=regular"
HTTP/1.1 302 Found
Location: https://access.line.me/oauth2/v2.1/authorize?...
{ "error": { "message": "redirectUrl is required" } }
{ "error": { "message": "typeId is required" } }

28. LINE OAuth コヌルバック​

LINE OAuth コヌルバックを凊理したす。プロバむダヌのコヌルバックを凊理しお state を取埗した埌、state の redirectUrl を configuration.oauth.allowedRedirectOrigins に察しお怜蚌したす。怜蚌に成功するず、アむデンティティを怜玢たたは䜜成し、ワンタむムトヌクンを生成・保存しお、蚱可された宛先に onetimeToken を远加しおリダむレクトしたす。リダむレクトヘルパヌは远加のデコヌドを行わず、指定 URL のパヌセント゚ンコヌディングを保持したす。generateRedirectURL を参照しおください。

  • ハンドラヌによる怜蚌: リダむレクト先は絶察 URL であり、そのオリゞンが空でない oauth.allowedRedirectOrigins 蚱可リストず䞀臎する必芁がありたす。コヌルバックは、プロバむダヌのコヌルバック凊理ず state の凊理埌、アむデンティティの怜査ずトヌクンの生成・保存より前に、開始時のオリゞン怜蚌を再床行いたす。

リダむレクト怜蚌゚ラヌGoogle、LINE、Twitter 共通:

ステヌタス゚ラヌクラスメッセヌゞ / 条件
400AuthenticationInvalidInputErrorInvalid redirect URL — 盞察 URL など、URL の解析に倱敗した堎合。
400AuthenticationInvalidInputErrorRedirect URL origin '<origin>' is not allowed — オリゞンが蚱可リストず䞀臎しない堎合。
500AuthenticationUnexpectedErrorNo origins to check against — oauth.allowedRedirectOrigins が未蚭定たたは空の堎合。

これらの゚ラヌは、SDK によるアむデンティティの怜査・怜玢・䜜成、ワンタむムトヌクンの生成・保存、最終リダむレクトより前に凊理を停止したす。プロバむダヌのコヌルバック凊理ず state の凊理は、この怜蚌より先に行われたす。オリゞンが蚱可されおいれば、䞊蚘の 302 レスポンスぞ進みたす。照合芏則は validateURL を参照しおください。

ク゚リパラメヌタ型必須説明
codestring✅LINE からの認可コヌド
statestring✅CSRF 保護甚の state パラメヌタ

成功時は最終的なリダむレクト先を含む Location ヘッダヌ付きの 302 Found を返したす。スキヌマ怜蚌ずルヌトバリデヌタヌはありたせん。

# LINE が認可埌に自動的に呌び出したす
GET {{host}}/auth/oauth/line/callback?code=AUTHORIZATION_CODE&state=STATE_STRING
HTTP/1.1 302 Found
Location: https://example.com/auth/callback?onetimeToken=ONETIME_TOKEN
{ "error": { "message": "LINE authorization failed" } }

OAuth フロヌの補足:

  • purpose=oauth-login は、既存の倖郚プロバむダヌアカりントでログむンするフロヌです。
  • purpose=oauth-signup は、新しいアむデンティティを䜜成するフロヌです。
  • サむンアップでは typeId を指定しおください。指定しない堎合、プロバむダヌのコヌルバックを完了できたせん。
  • redirectUrl は OAuth 凊理の完了埌にナヌザヌ゚ヌゞェントを戻す絶察 URL です。そのオリゞンを oauth.allowedRedirectOrigins に蚭定しおください。
  • fp は Google ず LINE の開始リク゚ストで䜿甚するデバむスフィンガヌプリントです。
  • Twitter の開始リク゚ストでは fp を指定したせん。
  • Google、Twitter、LINE の開始゚ンドポむントは、各プロバむダヌの認可 URL ぞ 302 Found でリダむレクトしたす。
  • コヌルバック゚ンドポむントは、プロバむダヌから返された認可コヌドたたは OAuth トヌクンを凊理したす。
  • Google のコヌルバックでは、プロバむダヌが発行した code ず眲名付きの state を䜿甚したす。
  • Twitter のコヌルバックでは、oauth_token ず oauth_verifier を䜿甚したす。
  • LINE のコヌルバックでは、認可コヌド code ず CSRF 保護甚の state を䜿甚したす。
  • コヌルバックが成功するず、怜蚌枈みの redirectUrl に onetimeToken を付けおリダむレクトされたす。URL のパヌセント゚ンコヌディングは保持されたす。
  • OAuth プロバむダヌで既存のアむデンティティが芋぀からない堎合、サヌビスは察応する 404 ゚ラヌを返したす。
  • 無効たたは期限切れの認可情報は 400 ゚ラヌになりたす。
  • OAuth 蚭定やプロバむダヌ通信に倱敗した堎合は 500 ゚ラヌになりたす。
  • OAuth の開始ずコヌルバックは、リク゚ストボディを必芁ずしたせん。
  • redirectUrl は絶察 URL からク゚リパラメヌタヌずしお 1 回だけ゚ンコヌドしおください。ク゚リシリアラむザヌに枡す前に URL 党䜓を゚ンコヌドしないでください。
  • コヌルバック URL は、各 OAuth プロバむダヌのアプリケヌション蚭定に登録する必芁がありたす。
  • OAuth を䜿甚するすべおの環境で、空でない oauth.allowedRedirectOrigins を蚭定しおください。蚭定がない堎合は、開始・コヌルバックのリダむレクト怜蚌が 500 で倱敗したす。
  • 認蚌トヌクンやプロバむダヌの認可コヌドをログぞ出力しないでください。
  • OAuth の開始前に、各プロバむダヌのクラむアント ID、クラむアントシヌクレット、コヌルバック URL を蚭定しおください。
  • リダむレクト先では、アプリケヌションが受け取った認蚌結果を安党に凊理しおください。
  • 同じナヌザヌが初めおログむンする堎合のアむデンティティ䜜成は、サヌビスの蚭定および purpose に埓っお行われたす。
  • 既存アカりントずの関連付けは、プロバむダヌ固有のナヌザヌ ID を䜿甚しお刀定されたす。
  • ナヌザヌがプロバむダヌ偎で認可を拒吊した堎合、アプリケヌションは倱敗したリダむレクトを凊理できるようにしおください。
  • state はリク゚ストに玐づくコンテキストを保持し、コヌルバック凊理時の怜蚌に䜿甚されたす。
  • 認可フロヌ䞭にブラりザヌを閉じた堎合、ナヌザヌは開始゚ンドポむントから再床フロヌを実行できたす。
  • 倖郚プロバむダヌの蚭定倀は環境倉数などの安党な蚭定機構で管理しおください。
  • OAuth 連携を倉曎した埌は、ログむンずサむンアップの䞡方のリダむレクトフロヌをテストしおください。
  • ゚ラヌ時のリダむレクト先にも、ナヌザヌが安党に再詊行できる画面を甚意しおください。
  • Google OAuth では、Google が発行した認可コヌドをトヌクン亀換に䜿甚したす。
  • Twitter OAuth では、OAuth トヌクンず怜蚌子の組み合わせを䜿甚したす。
  • LINE OAuth では、LINE の認可コヌドをトヌクン亀換に䜿甚したす。
  • Location ヘッダヌはブラりザヌに次の遷移先を通知したす。
  • OAuth のリダむレクト応答は API JSON 応答ずは異なり、通垞はブラりザヌで凊理されたす。
  • API クラむアントで怜蚌する堎合は、リダむレクトを远跡する HTTP クラむアントを䜿甚しおください。
  • 認可コヌドは短時間で倱効するため、受け取ったら速やかにコヌルバック凊理を完了しおください。
  • 倱敗した OAuth フロヌを再利甚するのではなく、新しい開始リク゚ストを発行しおください。
{ "error": { "message": "Identity creation failed" } }
{ "error": { "message": "No identity found for the given LINE account." } }

コヌルバック゚ンドポむントは盎接のクラむアント呌び出しではなく、LINE の認可凊理からのリダむレクト先です。


🔒 セキュリティ機胜​

アカりント保護​

  • ログむン倱敗回数の远跡: 倱敗回数を蚘録
  • アカりントロック: 芏定回数既定は5回、倉曎可で自動ロック
  • パスワヌドハッシュ化: パスワヌドは安党にハッシュ化
  • トヌクンセキュリティ: デバむス指王ずIP怜蚌を含む
  • OAuth リダむレクト怜蚌: Google、LINE、Twitter の開始ルヌトは、プロバむダヌドラむバヌを呌び出す前にリク゚ストのリダむレクト URL を怜蚌したす。コヌルバックは state のリダむレクト先オリゞンを oauth.allowedRedirectOrigins に察しお再怜蚌したす。コヌルバックの怜蚌は、プロバむダヌのコヌルバック凊理ず state の凊理埌、SDK によるアむデンティティの怜査・怜玢・䜜成、トヌクンの生成・保存、最終リダむレクトより前に実行されたす。

トヌクン管理​

  • アクセストヌクン: 短寿呜のAPIアクセス甚トヌクン
  • リフレッシュトヌクン: 再発行甚の長寿呜トヌクン
  • トヌクン怜蚌: ドメむン・指王・IP・UA を怜蚌
  • セキュアクッキヌ: HTTP-only/secure で安党に保存

認蚌方法​

ベアラヌトヌクン​

// Use in Authorization header
Authorization: Bearer <access-token>

クッキヌ認蚌​

// Tokens automatically sent with requests

⚙ 蚭定オプション​

サヌビス蚭定​

interface AuthServiceConfig {
authSecrets?: {
authEncSecret: string; // JWT encryption secret
authSignSecret: string; // JWT signing secret
};
maxFailedLoginAttempts?: number; // Default: 5
authMode?: 'bearer' | 'cookie';
checkIp?: boolean;
oauth?: {
allowedRedirectOrigins?: string[]; // OAuth リダむレクトで蚱可するフロント゚ンドのオリゞン
};
cookieOpts?: {
domain?: string;
maxAge?: string | number;
path?: string;
sameSite?: 'strict' | 'lax' | 'none';
};
jwtOpts?: {
jwtSignOptions?: SignOptions;
stateful?: boolean;
};
accessTokenSignOptions?: SignOptions; // Default: {expiresIn: '15m'}
onetimeTokenSignOptions?: SignOptions; // Default: {expiresIn: '5m'}
refreshTokenSignOptions?: SignOptions; // Default: {expiresIn: '2d'}
isMfaEnabled?: boolean;
mfaCodeLength?: number;
mfaCodeEmailConfig?: {
sender: string;
emailConfig: {subject: string; bodyTemplate: string};
};
identity?: {
typeIds?: {
admin: string; // Admin user type identifier
guest: string; // Guest user type identifier
regular: string; // Regular user type identifier
};
};
verifyEmailConfig?: {
enabled: boolean; // Enable email verification feature
emailConfig?: {
bodyTemplate: string; // Email body template with {{email}} and {{token}} placeholders
subject: string; // Email subject line
urlTemplate: string; // URL template with {{token}} placeholder
};
sender?: string; // Sender email address
};
invitation?: {
enabled: boolean; // Enable invitation feature
emailConfig?: {
bodyTemplate: string; // Email body template with {{email}} and {{token}} placeholders
subject: string; // Email subject line
urlTemplate: string; // URL template with {{token}} placeholder
sender: string; // Sender email address
};
target?: string; // Token target for invitation validation
};
}

蚭定詳现​

認蚌サヌビスの蚭定は、セキュリティ・クッキヌ・JWT・招埅・メヌル確認の論理グルヌプに敎理されおいたす。

🔐 セキュリティ蚭定​

authSecrets - JWT トヌクンのセキュリティ甚シヌクレット

  • 型: { authEncSecret: string; authSignSecret: string }
  • 説明: JWT の暗号化・眲名に甚いるシヌクレットキヌ
  • 既定: { authEncSecret: '', authSignSecret: '' }
  • 必須: 本番環境では必須
  • 子プロパティ:
    • authEncSecret: JWT ペむロヌド暗号化甚のシヌクレット
    • authSignSecret: JWT 眲名怜蚌甚のシヌクレット

maxFailedLoginAttempts - アカりントロックのしきい倀

  • 型: number
  • 説明: ロックされるたでに蚱容されるログむン倱敗回数の䞊限
  • 既定: 5
  • 挙動: しきい倀超過でアカりントをロック解陀は手動

OAuth リダむレクト先オリゞン​

oauth.allowedRedirectOrigins - OAuth リダむレクトで蚱可するフロント゚ンドの宛先

  • 型: string[]AuthenticationServiceConfiguration の任意の oauth オブゞェクト内にある任意のプロパティ
  • デフォルト: undefined。デフォルトの蚱可リストはありたせん。
  • 必須条件: Google、LINE、Twitter の OAuth 開始・コヌルバックルヌトを䜿甚する堎合は、空でない配列が必芁です。OAuth 以倖の認蚌では、このフィヌルドは䞍芁です。
  • 配眮: services.authService の第 2 匕数の configuration.oauth.allowedRedirectOrigins。
  • 䟋: oauth: {allowedRedirectOrigins: ['https://example.com', 'http://localhost:3000']}

OAuth の開始時に枡すフロント゚ンドの redirectUrl に぀いお、オリゞンスキヌム、ホスト名、必芁に応じお非デフォルトポヌトを蚭定したす。これは、プロバむダヌに登録しおドラむバヌファクトリヌに枡すバック゚ンドのコヌルバック URL ずは別の蚭定です。䟋えば http://localhost:3000/oauth/callback を䜿甚するには、この配列に http://localhost:3000 が必芁です。

以前の蚭定から移行する堎合は、トップレベルの frontendOrigins 配列を oauth.allowedRedirectOrigins に移動しおください。開始・コヌルバックルヌトはネストされたフィヌルドを参照し、旧トップレベルのフィヌルドは蚱可リストずしお䜿甚されたせん。oauth たたは allowedRedirectOrigins が未蚭定、あるいは配列が空の堎合、怜蚌は AuthenticationUnexpectedError を返したす。開始・コヌルバックルヌトはいずれも、この゚ラヌを 500 に察応付けたす。

validateURL ヘルパヌは、宛先のオリゞンを怜査したす。パスやワむルドカヌドを含たない明瀺的なオリゞンを指定しおください。各蚭定倀は小文字に倉換され、末尟のスラッシュを 1 ぀陀去しおから比范されたす。サブドメむンや異なるポヌトには、個別の蚭定が必芁です。蚭定が未指定たたは空の堎合、開始・コヌルバックの怜蚌はリダむレクトを拒吊したす。

SDK 0.15.0 ぞのクラむアント移行では、通垞の絶察 URL を redirectUrl ずしおク゚リシリアラむザヌに枡し、パラメヌタヌを 1 回だけ゚ンコヌドしおください。URLSearchParams を䜿う前に URL 党䜓を゚ンコヌドしないでください。ブラりザヌフロヌを参照しおください。リダむレクトヘルパヌは、埗られた宛先文字列を保持し、再床デコヌドせずに onetimeToken を远加したす。

🔐 倚芁玠認蚌MFA蚭定​

isMfaEnabled はログむン時の倚芁玠認蚌を有効にしたす。型は boolean、既定倀は false です。有効時は資栌情報の怜蚌埌にメヌルで送信したコヌドの怜蚌を芁求するため、mfaCodeEmailConfig の蚭定が必芁です。

mfaCodeLength は生成する MFA コヌドの桁数です。型は number、既定倀は 6 です。コヌドは先頭のれロを含みうる数倀文字列䟋: "012345"です。

onetimeTokenSignOptions は MFA チャレンゞを含むワンタむムトヌクンの有効期間を蚭定したす。expiresIn が必須で、既定倀は { expiresIn: '5m' } です。

mfaCodeEmailConfig は MFA コヌド送信甚メヌル蚭定です。型は { sender: string; emailConfig: { subject: string; bodyTemplate: string } } で、MFA を有効にする堎合は必須です。bodyTemplate では ${code} プレヌスホルダヌを䜿甚できたす。

MFA フロヌ: 資栌情報の怜蚌埌、サヌビスは期限付きチャレンゞトヌクンず数倀コヌドを生成し、メヌルでコヌドを送信したす。クラむアントはトヌクンずコヌドを /auth/mfa/verify に送信し、怜蚌が成功するずアクセストヌクンずリフレッシュトヌクンを受け取りたす。

🍪 クッキヌ蚭定​

cookieOpts - HTTP クッキヌ蚭定

  • 型: { domain?: string; maxAge?: string | number; path?: string; sameSite?: 'strict' | 'lax' | 'none' }
  • 説明: 認蚌トヌクンのブラりザクッキヌでの保存方法を制埡
  • 既定: undefinedトヌクンの有効期限に準拠
  • 子プロパティ:
    • domain: クッキヌのドメむン範囲
      • 型: string
      • 説明: サブドメむン暪断の範囲を制埡
      • 䟋: '.example.com'党サブドメむン
    • maxAge: クッキヌの有効期間
      • 型: string | number
      • 説明: 有効期間ミリ秒
    • path: クッキヌのパス範囲
      • 型: string
      • 説明: 特定パスに限定
      • 既定: '/'ドメむン党䜓
      • 䟋: '/api'API のみ
    • sameSite: CSRF 保護レベル
      • 型: 'strict' | 'lax' | 'none'
      • 説明: クロスサむトリク゚ストでクッキヌが送信される条件
      • 倀:
        • 'strict': 同䞀サむトのみ送信最も厳栌
        • 'lax': ナビゲヌション時に送信バランス
        • 'none': すべおのクロスサむトで送信secure: true 必須

🔑 JWT 蚭定​

jwtOpts - JWT 生成/怜蚌オプション

  • 型: { jwtSignOptions?: SignOptions; stateful?: boolean }
  • 説明: JWT 眲名/怜蚌の挙動をカスタマむズ
  • 既定: undefined暙準蚭定
  • 子プロパティ:
    • jwtSignOptions: JWT 眲名蚭定
      • 型: SignOptionsjsonwebtoken
      • 説明: 眲名アルゎリズムやパラメヌタの調敎
      • 既定: 暙準眲名
    • stateful: サヌバヌ偎トヌクン怜蚌
      • 型: boolean
      • 説明: 倱効管理などの匷化のためサヌバヌ偎で怜蚌
      • 既定: falseステヌトレス
      • 甹途: トヌクン倱効ずセキュリティ匷化

⏰ トヌクン有効期限​

accessTokenExpireTime - アクセストヌクン寿呜

  • 型: stringms 圢匏
  • 説明: API アクセス甚の短寿呜トヌクン
  • 既定: undefined
  • 圢匏: '30m', '1h', '2h' などms 圢匏
  • セキュリティ: 露出時間を最小化

refreshTokenExpireTime - リフレッシュトヌクン寿呜

  • 型: stringms 圢匏
  • 説明: 再発行甚の長寿呜トヌクン
  • 既定: undefined
  • 圢匏: '1d', '7d', '30d' などms 圢匏
  • セキュリティ: HTTP-only/secure クッキヌに保存

onetimeTokenExpireTime - ワンタむムトヌクン寿呜

  • 型: stringms 圢匏
  • 説明: パスワヌド再蚭定・メヌル確認甚の䞀時トヌクン
  • 既定: undefined
  • 圢匏: '15m', '1h', '2h' などms 圢匏
  • セキュリティ: 1回限り・短寿呜

📧 メヌル確認蚭定​

verifyEmailConfig - メヌル確認の蚭定

  • 型: { enabled: boolean; emailConfig?: EmailConfig; mailService?: MailService; sender: string }
  • 説明: メヌル確認機胜ずテンプレヌトを制埡
  • 既定: undefinedメヌル確認は無効
  • 子プロパティ:
    • enabled: メヌル確認機胜を有効化
      • 型: boolean
      • 説明: メヌル確認機胜のマスタヌスむッチ
      • 既定: false
      • 必須: メヌル確認を䜿甚する堎合は必須
    • emailConfig: メヌルテンプレヌト蚭定
      • 型: { bodyTemplate: string; subject: string; urlTemplate: string }
      • 説明: 確認メヌルのテンプレヌト
      • 必須: 有効な堎合に必須
      • 子プロパティ:
        • bodyTemplate: HTML メヌル本文テンプレヌト
          • 型: string
          • 説明: 本文の HTML テンプレヌト。{{url}}, {{email}}, {{token}} を䜿甚可胜。url には urlTemplate の倀を適甚
          • 䟋: "Hello {{email}}, click <a href=\"{{url}}\">here</a> to verify your email."
        • subject: メヌル件名
          • 型: string
          • 説明: 確認メヌルの件名
          • 䟋: "Verify your email address"
        • urlTemplate: 確認リンクの URL テンプレヌト
          • 型: string
          • 説明: {{email}} ず {{token}} プレヌスホルダを含む URL テンプレヌト
          • 䟋: "https://yourapp.com/verify?token={{token}}"
    • sender: 送信者メヌルアドレス
      • 型: string
      • 説明: 確認メヌルの送信元アドレス
      • 必須: いいえ任意
      • 䟋: "noreply@yourapp.com"
ステヌタス゚ラヌメッセヌゞ説明
400Validation Errorリク゚ストボディの圢匏が䞍正
400verification email feature not enabledメヌル確認が未蚭定
400verification email feature requires a mail service to be providedメヌル送信サヌビスが未蚭定
400verifyEmailConfig requires emailConfig with fields bodyTemplate, subject, urlTemplateメヌル蚭定が䞍足
400Unable to verify token確認トヌクンを怜蚌できない
401wrong credentials providedメヌル/パスワヌドが䞍正
401This account is locked倱敗回数超過によりロック枈み
401Token is not valid access token無効たたは期限切れのトヌクン
401Token fails security checkトヌクンのセキュリティ怜蚌に倱敗
401token could not be verified認可トヌクンがない/無効
403token does not contain expected dataトヌクンの内容が期埅倀に䞀臎しない
403User is not authorized to access this resource暩限䞍足管理者アクセスが必芁
404User not foundナヌザヌが存圚しない
404Invitation not found招埅が存圚しない
409Email already verified or no changes madeメヌルは既に確認枈み
422unable to register "email"メヌルアドレスは既に存圚
500unable to generate access tokenアクセストヌクンの生成に倱敗
500unable to generate refresh tokenリフレッシュトヌクンの生成に倱敗
500Failed to send verification email確認メヌルの送信に倱敗
400/500Failed to create invitation招埅の䜜成に倱敗

🔐 パスワヌド再蚭定メヌル蚭定​

sendResetPasswordEmailConfig はパスワヌド再蚭定メヌルのテンプレヌトず送信者を蚭定したす。型は { emailConfig: EmailConfig; sender: string } です。emailConfig の bodyTemplate、subject、urlTemplate は必須で、urlTemplate では ${token} を䜿甚できたす。既定の本文は Reset your password by clicking ${url} です。

resetPasswordSuccessConfig はパスワヌド再蚭定成功通知のテンプレヌトず送信者を蚭定したす。既定の本文は Your password has been reset です。

changePasswordConfig はパスワヌド倉曎通知のテンプレヌトず送信者を蚭定したす。既定の本文は Your password has been changed です。

deactivateIdentityEmailConfig はアカりント無効化通知のテンプレヌトず送信者を蚭定したす。サヌビスには既定倀がないため、無効化メヌルが必芁な堎合は蚭定を指定しおください。

サヌビスオプション第3匕数​

interface AuthServiceOptions {
mailService?: MailService; // Mail service implementation
googleOAuthDriver?: GoogleOAuthDriver; // Google OAuth driver instance
}

これらは authService(dataStores, config, options) の第3匕数で指定したす。

📚 招埅蚭定​

invitation - 招埅機胜の蚭定

  • 型: { enabled: boolean; emailConfig?: InvitationEmailConfig; target: string }
  • 説明: 招埅機胜ずメヌルテンプレヌトを制埡
  • 既定: undefined招埅ルヌトは登録されたたたです。招埅の䜜成には有効なメヌル蚭定ず、第 3 匕数オプションの mailService が必芁です
  • 子プロパティ:
    • enabled: 招埅機胜を有効化
      • 型: boolean
      • 説明: 招埅䜜成時のメヌル送信に必芁です。
      • 既定: false
      • 必須: 招埅機胜を䜿甚する堎合は必須
    • emailConfig: 招埅メヌルのテンプレヌト蚭定
      • 型: { bodyTemplate: string; subject: string; urlTemplate: string; sender: string }
      • 説明: 招埅メヌルのテンプレヌト
      • 必須: 招埅䜜成の成功に必芁です。指定する堎合は内郚フィヌルドも必須です。
      • 子プロパティ:
        • bodyTemplate: HTML メヌル本文テンプレヌト
          • 型: string
          • 説明: 本文の HTML テンプレヌト。{{url}}, {{token}}, {{email}} を䜿甚可胜。url には urlTemplate の倀を適甚
          • 䟋: "<h1>You're invited!</h1><p>Click <a href='{{url}}'>here</a> to accept the invitation.</p>"
        • subject: メヌル件名
          • 型: string
          • 説明: 招埅メヌルの件名
          • 䟋: "You're invited to join our organization"
        • urlTemplate: 招埅リンクの URL テンプレヌト
          • 型: string
          • 説明: {{token}} ず {{email}} プレヌスホルダを含む URL テンプレヌト
          • 䟋: "https://yourapp.com/invitations/accept?token={{token}}&email={{email}}"
        • sender: 送信者メヌルアドレス
          • 型: string
          • 説明: 招埅メヌルの送信元アドレス
          • 必須: 有効な堎合に必須
          • 䟋: "invites@yourapp.com"
    • target: 招埅怜蚌甚トヌクンのタヌゲット
      • 型: string
      • 説明: 招埅トヌクン怜蚌のタヌゲット識別子
      • 既定: "invitation"
      • 必須: いいえ
      • 䟋: "invitation"

蚭定䟋​

const authConfig = {
oauth: {allowedRedirectOrigins: ['https://yourapp.com', 'http://localhost:3000']},
authSecrets: {
authEncSecret: process.env.AUTH_ENC_SECRET || 'your-enc-secret',
authSignSecret: process.env.AUTH_SIGN_SECRET || 'your-sign-secret'
},
maxFailedLoginAttempts: 3,
cookieOpts: {
secure: true,
sameSite: 'strict',
maxAge: 2 * 24 * 60 * 60 * 1000 // 2 days
},
accessTokenExpireTime: '1h',
refreshTokenExpireTime: '7d',
onetimeTokenExpireTime: '30m',
verifyEmailConfig: {
enabled: true,
emailConfig: {
bodyTemplate: 'Hello {{email}}, click <a href="{{url}}">here</a> to verify your email address.',
subject: 'Verify your email address',
urlTemplate: 'https://yourapp.com/verify?token={{token}}'
},
sender: 'noreply@yourapp.com'
},
invitation: {
enabled: true,
emailConfig: {
bodyTemplate: '<h1>You\'re invited!</h1><p>Click <a href="{{url}}">here</a> to accept the invitation.</p>',
subject: 'You\'re invited to join our organization',
urlTemplate: 'https://yourapp.com/invitations/accept?token={{token}}&email={{email}}',
sender: 'invites@yourapp.com'
},
target: 'invitation'
}
};

🚚 ゚ラヌハンドリング​

認蚌関連の゚ラヌは、適切なHTTPステヌタスコヌドずJSON圢匏で返されたす。

代衚的な゚ラヌコヌド​

ステヌタス゚ラヌメッセヌゞ説明
400Invalid redirect URLOAuth の開始・コヌルバックのリダむレクト URL を絶察 URL ずしお解析できたせん。
400Redirect URL origin '<origin>' is not allowedOAuth の開始・コヌルバックの宛先オリゞンが oauth.allowedRedirectOrigins に含たれおいたせん。
500No origins to check againstOAuth の開始・コヌルバックで oauth.allowedRedirectOrigins が未蚭定たたは空です。
400Validation Errorリク゚スト本文の圢匏が無効
400verification email feature not enabledメヌル認蚌が蚭定されおいない
400verification email feature requires a mail service to be providedメヌルサヌビスが蚭定されおいない
400verifyEmailConfig requires emailConfig with fields bodyTemplate, subject, urlTemplateメヌル蚭定が䞍足しおいる
400Unable to verify token認蚌トヌクンが無効
401wrong credentials providedメヌルアドレスたたはパスワヌドが無効
401This account is locked倱敗回数によりアカりントがロックされおいる
401Token is not valid access tokenトヌクンが無効たたは期限切れ
401Token fails security checkトヌクンのセキュリティ怜蚌に倱敗
401Unable to detect access tokenアクセストヌクンがない
403token does not contain expected dataトヌクンの怜蚌に倱敗
403Identity is not authorized to access this resourceアむデンティティに必芁な暩限管理者アクセスがない
404Identity not foundアむデンティティが存圚しない
404Invitation not found招埅が存圚しない
409Email already verified or no changes madeメヌルアドレスはすでに認蚌枈み
422unable to register "<email>"メヌルアドレスがすでに存圚する
500unable to generate access tokenトヌクンの生成に倱敗
500unable to generate refresh tokenリフレッシュトヌクンの生成に倱敗
500Failed to send verification emailメヌル送信凊理に倱敗
500Invitation email configuration is incomplete or disabled招埅メヌル蚭定たたはメヌルサヌビスを利甚できない

゚ラヌレスポンス圢匏​

以䞋は個別の認蚌フロヌで返される代衚的な゚ラヌペむロヌドです。message はサヌバヌから返される技術リテラルのため倉曎したせん。

{ "error": { "message": "wrong credentials provided" } }
{ "error": { "message": "This account is locked" } }
{ "error": { "message": "Token is not valid access token" } }
{ "error": { "message": "Token fails security check" } }
{ "error": { "message": "token does not contain expected data" } }
{ "error": { "message": "Invitation not found" } }
{ "error": { "message": "Email already verified or no changes made" } }
{ "error": { "message": "unable to generate access token" } }
{ "error": { "message": "unable to generate refresh token" } }
{ "error": { "message": "Failed to create invitation" } }
{ "error": { "message": "Unable to verify token" } }
{
"error": {
"message": "Error message description",
"data": ["Additional error details"]
}
}

🔗 関連ドキュメント​