本書は 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_SECRETJWT利用時は必須アクセストークン署名用(十分に長いランダム文字列)
JWT_ISS任意issuer。未設定時は https://lnx.digital
JWT_ACCESS_TTL任意アクセストークン有効秒数(数字のみ)。未設定時は 900
JWT_REFRESH_TTL任意リフレッシュトークン有効秒数。未設定時は 1209600(14日相当)
OIDC_ISSUEROIDC利用時は必須IdP の issuer
OIDC_CLIENT_IDOIDC利用時は必須クライアントID
OIDC_REDIRECT_URIOIDC利用時は必須リダイレクトURI
OIDC_CLIENT_SECRET任意コンフィデンシャルクライアント用
OIDC_SCOPES任意未設定時は openid profile email

アプリ・DB

  • PHP が first をドキュメントルート(またはそのサブパス)として解決できること
  • first/dba/config.php 等による DB 接続が有効であること(会員系・JWT リフレッシュは DB を使用)

接続の流れ(概要)

  1. 会員サイト向け: ドメイン/サイトコードでサイトを特定し、メールとパスワードで認証する(member/auth)。成功時は code に view 用 ID が入ります。
  2. コンソール(管理)向け JWT: JSON で clientId / loginID / password を jwt/loginConsole.php に送り、accessToken と refreshToken を取得します。
  3. トークン更新: refreshToken を jwt/refresh.php に POST してローテーションします。
  4. 失効: refreshToken または Authorization: Bearer <accessToken> を jwt/revoke.php に渡します。
  5. 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
resultsuccess または 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)
resultsuccess または 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本文

レスポンスフィールド

フィールド説明
actionsendMessage
resultsuccess または 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はいstringdigitalnx またはサイト/グループのクライアントID
loginIDはいstringメール等のログインID
passwordはいstringパスワード
redirectURL任意stringログイン後の遷移先。notDirected の場合は既定ダッシュボード扱い

レスポンスフィールド

フィールド説明
actioncheckMailExists
resultsuccess または error
state現状は空文字で返る実装
errorCode失敗時コード
nextPageコンソール/コールバック用の次URL(クライアント種別により内容が異なる)
accessToken成功時のみ: JWT 文字列
refreshToken成功時のみ: 不透明リフレッシュトークン
expiresIn成功時のみ: アクセストークンの有効秒数
tokenType成功時: Bearer

主な errorCode(実装より)

errorCode意味
PostFieldErrorclientId / 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 で得た生トークン

レスポンスフィールド

フィールド説明
actionjwtRefresh
resultsuccess または error
errorCode失敗理由
accessToken, refreshToken, expiresIn, tokenType成功時のみ(refreshToken はローテーションされ新しい値)

errorCode(refresh)

errorCode意味
PostFieldError初期状態(未使用に近い)
refreshTokenRequiredrefreshToken が空
JWT_SECRET_UNSETJWT_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 の少なくとも一方が必要。両方指定可能。

レスポンスフィールド

フィールド説明
actionjwtRevoke
result通常 success、パラメータ不正やトークン不正で error
errorCode失敗時
revokednone / family / user_all / family_and_user

errorCode

errorCode意味
refreshToken_or_bearer_required両方とも欠落
invalid_refresh_tokenrefresh のみ指定したがハッシュ不一致
invalid_access_tokenBearer が無効
JWT_SECRET_UNSETBearer 検証時にシークレット未設定

JWT: パスワード変更

URL: POST /api/jwt/changePassword.php

リクエストヘッダー:

  • Content-Type: application/json
  • Authorization: Bearer <accessToken>(必須)
パラメータ必須型説明
currentPasswordはいstring現パスワード
newPasswordはいstring新パスワード(現パスワードと同一不可)

レスポンスフィールド

フィールド説明
actionjwtChangePassword
resultsuccess または error
errorCode失敗理由

errorCode

errorCode意味
bearer_requiredAuthorization 欠落
PostFieldErrorパスワード項目欠落
password_unchanged新旧が同一
JWT_SECRET_UNSETシークレット未設定
invalid_access_tokenJWT 不正・期限切れ等
auth_failed現パスワード不一致・ユーザー解決失敗・更新検証失敗

成功時は当該ユーザーの全リフレッシュトークンが失効します。


OIDC: 開始

URL: POST /api/jwt/oidc/start.php

パラメータ必須型説明
clientIdはいstringJWT ログインと同様のクライアントID
redirectURL任意stringログイン完了後の nextPage に使われる候補

レスポンス(成功時)

フィールド説明
actionoidcStart
resultsuccess
stateIdP に渡す state
stateTokenサーバ側検証用トークン(callback とセットで使用)
authorizeUrlブラウザで開く認可エンドポイントの完全 URL
expiresIn300(state 関連の有効目安・秒)

errorCode: oidcDisabled, PostFieldError, oidcStartFailed


OIDC: コールバック(トークン交換)

URL: POST /api/jwt/oidc/callback.php

パラメータ必須型説明
codeはいstringIdP からの認可コード
stateはいstringstart 時に発行した state
stateTokenはいstringstart 時に発行した 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= を付けているか

参考実装パス

種別パス
会員 APIfirst/api/member/*/index.php
JWT APIfirst/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
OIDCfirst/lib/OidcService.php, first/lib/OidcLoginState.php
コンソール向けドキュメント・API設定first/console/siteDetail/(API連携設定ブロック)、first/console/siteDetail/documents/
PAGE TOP