DigitaLNXは統一ログインで業務を効率化するシステムです。SSO、API連携、会員制コンテンツ化を簡単に導入が可能です。多様なアプリケーションを統合し、操作を自動化します。利便性向上と収益化を支援し、柔軟なカスタマイズも可能。すべてのビジネスに新たな価値を提供します。
DigitaLNX API 連携ガイド
本書は、DigitaLNX と外部サイト・アプリケーションを連携するための公開向けドキュメントです。
概要
DigitaLNX では、サイト利用者の認証・ユーザー情報の取得・メッセージ送信などを REST API およびブラウザサインインで提供します。
| 項目 | 内容 |
|---|---|
| API ベース URL | https://lnx.digital/api/ |
| レスポンス形式 | JSON |
| Content-Type | 多くのエンドポイントは text/javascript; charset=utf-8 を返します |
| エラー表現 | HTTP 200 のまま JSON 内の result / errorCode で成功・失敗を判定してください |
用語
| 用語 | 説明 |
|---|---|
| clientId | サイトまたはグループを識別する ID。API 呼び出しやサインイン URL に指定します |
| siteCode | サイト単位の clientId と同義で使われる場合があります |
| グループ | 1 つのサイト配下の区画(例: 別サービス・別アプリ)。グループごとに clientId が割り当てられます |
| コールバック URL | ブラウザサインイン成功後、利用者を戻す先 URL。DigitaLNX コンソールの「API連携設定」で登録します |
| userToken | サインイン成功後にコールバック URL へ付与される認証トークン |
| view コード(subID) | サイト内でユーザーを識別するコード。トークン検証 API のレスポンスで取得します |
連携パターン
パターン A: ブラウザサインイン + コールバック(推奨)
外部サイトから DigitaLNX のログイン画面へ誘導し、認証後に自サイトへ戻す方式です。
1. 利用者を DigitaLNX サインイン URL へリダイレクト
2. 利用者が ID / パスワードでログイン
3. 登録済みコールバック URL へリダイレクト(clientID と token が付与される)
4. 自サイト側で token を検証 API に送り、利用者を特定
5. 自サイトのセッションを開始グループ clientId でサインインした場合、DigitaLNX 側の管理コンソール用セッションは作成されません。必ずコールバック先で userToken を受け取り、自サイト側でログイン状態を管理してください。
パターン B: API 直接認証
サーバーまたはクライアントアプリから、メールアドレスとパスワードを API に送信して認証する方式です。
- JSON 認証:
POST /api/member/auth/ - フォーム POST 認証:
POST /api/member/authKaraage/
ブラウザサインイン
サインイン URL
https://lnx.digital/auth/signin/?clientId=<clientId>| クエリ | 必須 | 説明 |
|---|---|---|
clientId | はい | サイトまたはグループの clientId |
redirect | 任意 | ログイン後の遷移先(サイト種別により利用されない場合があります) |
注意: URL パスは すべて小文字 の signin を使用してください。signIn(大文字 I)は Linux サーバー上では 404 になります。
サインイン成功後のリダイレクト(グループ clientId)
コールバック URL が登録されている場合:
https://<your-site>/path/to/callback?clientID=<clientId>&token=<userToken>コールバック URL が未登録の場合、システム既定の URL が使われます。連携サイトでは 必ず DigitaLNX コンソールでコールバック URL を設定 してください。
コールバック URL の設定
- DigitaLNX 管理コンソールにログイン
- 対象サイトの サイト詳細 を開く
- API連携設定 で、該当 clientId のコールバック URL を登録
コールバック URL は http:// または https:// で始まる有効な URL である必要があります。
エンドポイント一覧
会員: 認証(JSON)
URL: POST /api/member/auth/
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
domain | はい | string | サイト識別に使用するドメイン |
code | はい | string | サイト識別に使用するコード |
email | はい | string | ログイン ID(メールアドレス) |
password | はい | string | パスワード |
レスポンス
| フィールド | 説明 |
|---|---|
action | signin |
result | success または error |
errorCode | 失敗時の理由コード |
code | 成功時: view 用 ID |
nextURL | サイト登録用コールバック URL(未設定時は空) |
主な errorCode
| errorCode | 意味 |
|---|---|
PostFieldError | 必須パラメータ不足 |
invalidDomain | ドメインが不正 |
invalidKey | サイトコードが不正 |
CannotSignIn | 認証失敗 |
会員: 認証(フォーム POST)
URL: POST /api/member/authKaraage/
リクエスト: application/x-www-form-urlencoded または multipart/form-data
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
siteID | はい | string | グループの clientId |
loginID | はい | string | ログイン ID |
password | はい | string | パスワード |
レスポンス
| フィールド | 説明 |
|---|---|
action | singin |
result | success または error |
errorCode | 失敗理由 |
code | 成功時: view 用 ID |
nextURL | 未使用(空) |
主な errorCode
| errorCode | 意味 |
|---|---|
PostFieldError1〜6 | 必須パラメータ不足 |
SiteCodeError3 | サイトコード不正 |
CannotSignIn | 認証失敗 |
NotRegist | 未登録 |
会員: トークン検証
ブラウザサインイン後に受け取った token を検証する API です。コールバック受け口での必須処理 です。
URL: POST /api/member/groupUserAuth/
リクエスト: application/x-www-form-urlencoded または multipart/form-data
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
siteCode | はい | string | clientId(コールバックの clientID と同じ値) |
userToken | はい | string | コールバックで受け取った token |
レスポンス
| フィールド | 説明 |
|---|---|
result | 成功時 OK、失敗時 error |
errorCode | 失敗理由 |
subID | 成功時: ユーザーの view コード |
主な errorCode
| errorCode | 意味 |
|---|---|
siteCodeIsRequired | siteCode 未指定 |
tokenRequired | userToken 未指定 |
inValidToken | トークンが無効または期限切れ |
inValidCode-<siteID>_<siteCode> | clientId がトークンと一致しない |
会員: メールアドレス取得
URL: POST /api/member/user/
リクエスト: application/x-www-form-urlencoded または multipart/form-data
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
siteCode | はい | string | サイト clientId |
userSub | はい | string | ユーザーの view コード |
レスポンス
| フィールド | 説明 |
|---|---|
result | 成功時 OK、失敗時 error |
errorCode | 失敗理由 |
mailAddress | 成功時: メールアドレス |
会員: メッセージ送信
URL: POST /api/member/sendMessage/
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
code | はい | string | サイト clientId |
subID | はい | string | ユーザーの view コード |
subject | はい | string | 件名 |
message | はい | string | 本文 |
レスポンス
| フィールド | 説明 |
|---|---|
action | sendMessage |
result | success または error |
errorCode | 失敗理由 |
サイト管理者向け JWT API
DigitaLNX 管理コンソールや、サーバー間連携で JWT 認証を利用する場合に使用します。
JWT: ログイン
URL: POST /api/jwt/loginConsole.php
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
clientId | はい | string | サイト / グループの clientId |
loginID | はい | string | ログイン ID |
password | はい | string | パスワード |
redirectURL | 任意 | string | ログイン後の遷移先 |
レスポンス(成功時)
| フィールド | 説明 |
|---|---|
result | success |
accessToken | JWT アクセストークン |
refreshToken | リフレッシュトークン |
expiresIn | アクセストークン有効秒数(既定 900 秒) |
tokenType | Bearer |
nextPage | 遷移先 URL |
主な errorCode
| errorCode | 意味 |
|---|---|
PostFieldError | 必須パラメータ不足 |
needSignUp | アカウント未登録 |
invalidKey | clientId 不正 |
JWT: トークン更新
URL: POST /api/jwt/refresh.php
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
refreshToken | はい | string | 前回取得したリフレッシュトークン |
成功時、新しい accessToken と refreshToken が返ります。旧リフレッシュトークンは無効になります。
主な errorCode: refreshTokenRequired, invalid_refresh, refresh_reuse, refresh_expired
JWT: トークン失効
URL: POST /api/jwt/revoke.php
refreshToken または Authorization: Bearer <accessToken> の少なくとも一方が必要です。
JWT: パスワード変更
URL: POST /api/jwt/changePassword.php
ヘッダー: Authorization: Bearer <accessToken>(必須)
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
currentPassword | はい | string | 現パスワード |
newPassword | はい | string | 新パスワード |
レスポンス例
ブラウザサインイン後のコールバック(自サイト側で受信)
GET https://example.com/auth/callback?clientID=6a4744635855bUTI1&token=abc123...自サイトでは token を groupUserAuth API で検証してください。
トークン検証成功
{
"result": "OK",
"errorCode": "",
"subID": "view-code-example"
}会員認証成功(JSON API)
{
"action": "signin",
"result": "success",
"errorCode": "",
"code": "<viewID>",
"nextURL": ""
}JWT ログイン成功
{
"action": "checkMailExists",
"result": "success",
"state": "",
"errorCode": "",
"nextPage": "https://lnx.digital/console/dashboard/",
"accessToken": "<JWT>",
"refreshToken": "<opaque>",
"expiresIn": 900,
"tokenType": "Bearer"
}連携時のトラブルシューティング
サインイン後に再びログイン画面へ戻る
| 確認項目 | 対応 |
|---|---|
| コールバック URL | DigitaLNX コンソールの API連携設定で正しい URL が登録されているか |
| clientId の種類 | グループ clientId の場合、DigitaLNX コンソール用セッションは作られません |
| トークン検証 | コールバック受け口で groupUserAuth を呼び出しているか |
| URL の大文字小文字 | サインイン URL は /auth/signin/(小文字)を使用する |
API で PostFieldError が返る
- JSON API には
Content-Type: application/jsonと JSON 本文を送る - フォーム API には
application/x-www-form-urlencodedを使う - パラメータ名の大文字小文字を表のとおりに指定する
inValidToken / inValidCode が返る
- コールバックの
clientIDとsiteCodeが一致しているか tokenを URL デコードしてから API に渡しているか- トークンの有効期限切れ(再ログインが必要)
JWT の invalid_access_token
Authorization: Bearer <JWT>形式でヘッダーを送る- 期限切れの場合は
refresh.phpで更新する
サポート
API 連携設定(clientId・コールバック URL)は、DigitaLNX 管理コンソールの サイト詳細 → API連携設定 から確認・編集できます。
技術的なお問い合わせは、DigitaLNX サポート窓口までご連絡ください。
API 接続ガイド
本書は first/api 配下の実装に基づく接続手順・パラメータ・レスポンス・エラー確認のまとめです。OpenAPI 定義はリポジトリ内にありません。
共通事項
| 項目 | 内容 |
|---|---|
| ベースURL | デプロイ先のオリジンに続けて /api/...(例: https://<ホスト>/api/member/auth/) |
| 旧パス | /api/auth/ 等は /api/member/... へのシムとして併存する場合があります |
| レスポンス形式 | 本文は JSON。多くのエンドポイントは Content-Type: text/javascript; charset=utf-8 を返します |
| HTTPメソッド | 実装は php://input または $_POST / $_GET ベースです。クライアントは各表の推奨メソッドで送ってください |
環境変数(JWT / OIDC)
| 変数名 | 必須 | 説明 |
|---|---|---|
JWT_SECRET | JWT利用時は必須 | アクセストークン署名用(十分に長いランダム文字列) |
JWT_ISS | 任意 | issuer。未設定時は https://lnx.digital |
JWT_ACCESS_TTL | 任意 | アクセストークン有効秒数(数字のみ)。未設定時は 900 |
JWT_REFRESH_TTL | 任意 | リフレッシュトークン有効秒数。未設定時は 1209600(14日相当) |
OIDC_ISSUER | OIDC利用時は必須 | IdP の issuer |
OIDC_CLIENT_ID | OIDC利用時は必須 | クライアントID |
OIDC_REDIRECT_URI | OIDC利用時は必須 | リダイレクトURI |
OIDC_CLIENT_SECRET | 任意 | コンフィデンシャルクライアント用 |
OIDC_SCOPES | 任意 | 未設定時は openid profile email |
アプリ・DB
- PHP が
firstをドキュメントルート(またはそのサブパス)として解決できること first/dba/config.php等による DB 接続が有効であること(会員系・JWT リフレッシュは DB を使用)
接続の流れ(概要)
- 会員サイト向け: ドメイン/サイトコードでサイトを特定し、メールとパスワードで認証する(
member/auth)。成功時はcodeに view 用 ID が入ります。 - コンソール(管理)向け JWT: JSON で
clientId/loginID/passwordをjwt/loginConsole.phpに送り、accessTokenとrefreshTokenを取得します。 - トークン更新:
refreshTokenをjwt/refresh.phpに POST してローテーションします。 - 失効:
refreshTokenまたはAuthorization: Bearer <accessToken>をjwt/revoke.phpに渡します。 - OIDC:
oidc/start.phpでauthorizeUrlを取得 → ブラウザで IdP に遷移 → コールバック後にoidc/callback.phpにcode/state/stateTokenを POST して JWT を取得します。
エンドポイント一覧とパラメータ定義表
会員: 認証(JSON)
URL: POST /api/member/auth/(旧: POST /api/auth/)
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
domain | はい | string | サイト識別に使用するドメイン |
code | はい | string | サイト識別に使用するコード |
email | はい | string | ログインID(メール) |
password | はい | string | パスワード |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | 固定で signin |
result | success または error |
errorCode | 失敗時の理由コード(成功時は空文字の場合あり) |
code | 成功時: view 用 ID(トークン文字列)。失敗時は空 |
nextURL | サイト登録用コールバック URL(無ければ空文字) |
会員: からあげ等(フォームPOST)
URL: POST /api/member/authKaraage/(旧: POST /api/authKaraage/)
リクエスト: application/x-www-form-urlencoded または multipart/form-data($_POST)
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
siteID | はい | string | クライアント側サイトコード(グループ解決に使用) |
loginID | はい | string | ログインID |
password | はい | string | パスワード |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | 実装上 singin(typo) |
result | success または error |
errorCode | 失敗理由(PostFieldError1〜6, SiteCodeError3, CannotSignIn, NotRegist 等) |
code | 成功時: view 用 ID |
nextURL | 現状ほぼ未使用(空) |
会員: メール取得
URL: POST /api/member/user/(旧: POST /api/user/)
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
siteCode | はい | string | サイトクライアントコード |
userSub | はい | string | ユーザーの view コード |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
result | 成功時 OK、失敗時 error |
errorCode | 失敗理由コード |
mailAddress | 成功時: メールアドレス |
会員: グループユーザートークン検証
URL: POST /api/member/groupUserAuth/(旧: POST /api/groupUserAuth/)
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
siteCode | はい | string | サイトクライアントコード |
userToken | はい | string | 検証するトークン |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
result | 成功時 OK、失敗時 error |
errorCode | 失敗理由(inValidToken, tokenRequired, siteCodeIsRequired, inValidCode-<siteID>_<siteCode> 等) |
subID | 成功時: view コード |
会員: メッセージ送信(JSON)
URL: POST /api/member/sendMessage/(旧: POST /api/sendMessage/)
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
code | はい | string | サイトクライアントコード(checkSiteByClientID) |
subID | はい | string | ユーザーの view コード |
subject | はい | string | 件名 |
message | はい | string | 本文 |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | sendMessage |
result | success または error |
errorCode | 失敗理由 |
code, nextURL | 互換用(送信APIでは実質未使用) |
JWT: コンソールログイン
URL: POST /api/jwt/loginConsole.php または POST /api/jwt/login.php
(実体: first/api/admin/jwt/loginConsole.php)
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
clientId | はい | string | digitalnx またはサイト/グループのクライアントID |
loginID | はい | string | メール等のログインID |
password | はい | string | パスワード |
redirectURL | 任意 | string | ログイン後の遷移先。notDirected の場合は既定ダッシュボード扱い |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | checkMailExists |
result | success または error |
state | 現状は空文字で返る実装 |
errorCode | 失敗時コード |
nextPage | コンソール/コールバック用の次URL(クライアント種別により内容が異なる) |
accessToken | 成功時のみ: JWT 文字列 |
refreshToken | 成功時のみ: 不透明リフレッシュトークン |
expiresIn | 成功時のみ: アクセストークンの有効秒数 |
tokenType | 成功時: Bearer |
主な errorCode(実装より)
| errorCode | 意味 |
|---|---|
PostFieldError | clientId / loginID / password の不足 |
needSignUp | メイン未登録 |
invalidKey | サイトID解決失敗 |
JWT_SECRET_UNSET | 環境変数 JWT_SECRET 未設定 |
CannotResolveUser | 認証は成功したがユーザーIDを解決できない(グループ等の分岐) |
※ 認証失敗で result が error かつ errorCode が空のケースがあります(実装依存)。
JWT: リフレッシュ
URL: POST /api/jwt/refresh.php
リクエストヘッダー: Content-Type: application/json
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
refreshToken | はい | string | ログインまたは直前の refresh で得た生トークン |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | jwtRefresh |
result | success または error |
errorCode | 失敗理由 |
accessToken, refreshToken, expiresIn, tokenType | 成功時のみ(refreshToken はローテーションされ新しい値) |
errorCode(refresh)
| errorCode | 意味 |
|---|---|
PostFieldError | 初期状態(未使用に近い) |
refreshTokenRequired | refreshToken が空 |
JWT_SECRET_UNSET | JWT_SECRET 未設定 |
invalid_refresh | トークンがDBに存在しない |
refresh_reuse | 失効済みトークンの再利用検知 |
refresh_expired | 期限切れ |
JWT: 失効
URL: POST /api/jwt/revoke.php
リクエストヘッダー: Content-Type: application/json
任意ヘッダー: Authorization: Bearer <accessToken>
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
refreshToken | 条件付き | string | 指定時は該当ファミリーを失効 |
ルール: refreshToken と Bearer の少なくとも一方が必要。両方指定可能。
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | jwtRevoke |
result | 通常 success、パラメータ不正やトークン不正で error |
errorCode | 失敗時 |
revoked | none / family / user_all / family_and_user |
errorCode
| errorCode | 意味 |
|---|---|
refreshToken_or_bearer_required | 両方とも欠落 |
invalid_refresh_token | refresh のみ指定したがハッシュ不一致 |
invalid_access_token | Bearer が無効 |
JWT_SECRET_UNSET | Bearer 検証時にシークレット未設定 |
JWT: パスワード変更
URL: POST /api/jwt/changePassword.php
リクエストヘッダー:
Content-Type: application/jsonAuthorization: Bearer <accessToken>(必須)
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
currentPassword | はい | string | 現パスワード |
newPassword | はい | string | 新パスワード(現パスワードと同一不可) |
レスポンスフィールド
| フィールド | 説明 |
|---|---|
action | jwtChangePassword |
result | success または error |
errorCode | 失敗理由 |
errorCode
| errorCode | 意味 |
|---|---|
bearer_required | Authorization 欠落 |
PostFieldError | パスワード項目欠落 |
password_unchanged | 新旧が同一 |
JWT_SECRET_UNSET | シークレット未設定 |
invalid_access_token | JWT 不正・期限切れ等 |
auth_failed | 現パスワード不一致・ユーザー解決失敗・更新検証失敗 |
成功時は当該ユーザーの全リフレッシュトークンが失効します。
OIDC: 開始
URL: POST /api/jwt/oidc/start.php
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
clientId | はい | string | JWT ログインと同様のクライアントID |
redirectURL | 任意 | string | ログイン完了後の nextPage に使われる候補 |
レスポンス(成功時)
| フィールド | 説明 |
|---|---|
action | oidcStart |
result | success |
state | IdP に渡す state |
stateToken | サーバ側検証用トークン(callback とセットで使用) |
authorizeUrl | ブラウザで開く認可エンドポイントの完全 URL |
expiresIn | 300(state 関連の有効目安・秒) |
errorCode: oidcDisabled, PostFieldError, oidcStartFailed
OIDC: コールバック(トークン交換)
URL: POST /api/jwt/oidc/callback.php
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
code | はい | string | IdP からの認可コード |
state | はい | string | start 時に発行した state |
stateToken | はい | string | start 時に発行した stateToken |
成功時は JWT ログインと同様に accessToken, refreshToken, expiresIn, tokenType, nextPage が返ります。
errorCode: oidcDisabled, PostFieldError, JWT_SECRET_UNSET, ユーザーマッピング失敗時は resolve_oidc_admin_user の結果、oidcCallbackFailed 等
管理: メールテスト
URL: GET /api/admin/test.php(旧: GET /api/test.php)
| パラメータ | 必須 | 型 | 説明 |
|---|---|---|---|
mail | はい | string | クエリ ?mail= |
レスポンス: Content-Type: application/json — ユーザー情報の連想配列、または {"error":"not found"}。欠落時は HTTP 400 と {"error":"Specify mail address: ?mail="}。
レスポンス例
会員認証成功
{
"action": "signin",
"result": "success",
"errorCode": "",
"code": "<viewIDトークン>",
"nextURL": ""
}会員認証失敗(ドメイン不正)
{
"action": "signin",
"result": "error",
"errorCode": "invalidDomain",
"code": "",
"nextURL": ""
}JWT ログイン成功
{
"action": "checkMailExists",
"result": "success",
"state": "",
"errorCode": "",
"nextPage": "https://lnx.digital/console/dashboard/",
"accessToken": "<JWT>",
"refreshToken": "<opaque>",
"expiresIn": 900,
"tokenType": "Bearer"
}JWT リフレッシュ成功
{
"action": "jwtRefresh",
"result": "success",
"errorCode": "",
"accessToken": "<新JWT>",
"refreshToken": "<新opaque>",
"expiresIn": 900,
"tokenType": "Bearer"
}JWT リフレッシュ失敗(期限切れ)
{
"action": "jwtRefresh",
"result": "error",
"errorCode": "refresh_expired",
"accessToken": "",
"refreshToken": "",
"expiresIn": 0,
"tokenType": "Bearer"
}会員メール取得成功
{
"result": "OK",
"errorCode": "",
"mailAddress": "user@example.com"
}OIDC start 成功(概念例)
{
"action": "oidcStart",
"result": "success",
"errorCode": "",
"state": "<state>",
"stateToken": "<stateToken>",
"authorizeUrl": "https://idp.example/authorize?...",
"expiresIn": 300
}エラー時の確認手順
1. HTTP ステータスだけ見ていないか
多くの API はエラーでも HTTP 200 のまま JSON で result: error を返します。クライアントは 本文の result / errorCode を必ず解釈してください。
2. 会員系で PostFieldError / siteCodeRequired 等
| 確認項目 | 対応 |
|---|---|
| JSON API にフォームだけ送っている | Content-Type: application/json と JSON 本文(member/auth, member/sendMessage) |
member/user に JSON を送っている | application/x-www-form-urlencoded で siteCode, userSub |
| 必須キーの綴り | 表の名前と完全一致(大文字小文字含む) |
3. invalidDomain / invalidKey(member/auth)
domainとcodeが DB 上のサイト定義と一致するか- サイト側の登録・キー配布ミスがないか
4. CannotSignIn / 認証失敗
- メール・パスワードの誤り、未登録
- JWT ログインで
needSignUp: メイン登録フローが必要
5. JWT_SECRET_UNSET
- サーバ環境に
JWT_SECRETを設定し PHP からgetenv('JWT_SECRET')で見えることを確認 - 設定変更後は PHP-FPM / Apache の再起動が必要な場合あり
6. JWT invalid_access_token / bearer_required
| 確認項目 | 対応 |
|---|---|
| ヘッダー形式 | Authorization: Bearer <1行のJWT>(Bearer の前後スペースは実装で許容) |
| 期限切れ | refreshToken で jwt/refresh.php を呼び再取得 |
| 時刻ずれ | NTP・サーバ時刻のずれが大きいと検証失敗の原因になり得ます |
7. refresh で refresh_reuse / invalid_refresh
- 同一 refresh を二重送信していないか(ローテーション後は旧トークン無効)
- 失効・期限切れ後に古いトークンを使っていないか
refresh_reuseはセキュリティ上、ファミリー単位で失効が進む実装です。全セッションを切りたい場合はrevokeを検討
8. sendMessage で sendFailed
- AWS SES 等の送信設定・権限・レート制限
noMailAddress: ユーザーにメールが未設定
9. OIDC で oidcDisabled / oidcStartFailed / oidcCallbackFailed
- 必須環境変数が揃っているか(
OidcServiceの要件) OIDC_REDIRECT_URIが IdP 登録と完全一致するかstate/stateTokenの有効期限(start から 300 秒目安)内に callback しているか- IdP の
codeが一度きりであること(再送不可)
10. 管理テスト API が 400
GETで?mail=を付けているか
参考実装パス
| 種別 | パス |
|---|---|
| 会員 API | first/api/member/*/index.php |
| JWT API | first/api/admin/jwt/*.php, first/api/admin/jwt/oidc/*.php |
| 公開シム | first/api/jwt/*.php, first/api/auth/*.php 等 |
| JWT ロジック | first/lib/JwtService.php, first/models/JwtRefreshModel.php |
| コンソールログイン解決 | first/auth/lib/resolveConsoleLogin.php |
| OIDC | first/lib/OidcService.php, first/lib/OidcLoginState.php |
| コンソール向けドキュメント・API設定 | first/console/siteDetail/(API連携設定ブロック)、first/console/siteDetail/documents/ |