サインイントランザクションを作成

POST /fapi/v1/transactions · 環境のサインインホストから呼び出されます

アプリケーションのサインイントランザクションを開始します。ホスト型サインインページ、UI コンポーネント、ヘッドレスクライアントは、環境のサインインホスト(keenauth.app のサブドメインまたは確認済みのカスタムドメイン)でこのエンドポイントを呼び出します。レスポンスでは、トランザクション Cookie __Host-idp_ltx(Secure、HttpOnly、SameSite=Lax、有効期間 15 分)が設定され、後続の手順はこの Cookie を使用します。

リクエスト

ヘッダー:

Header Required Description
Idp-Client yes SDK 識別子。形式は <package>/<version> (<runtime>/<version>) です。
Origin yes 正確に https://<sign-in host> である必要があります。

ボディ:

Field Type Required Description
client_id string yes アプリケーションのクライアント ID。
redirect_uri string (URI) yes アプリケーションに登録済みのリダイレクト URI のいずれか。

レスポンス

201 Created でトランザクションオブジェクトを返します:

{
  "schema_version": 1,
  "state": "identifier_pending",
  "next_steps": [{ "step": "identifier", "fields": ["identifier"] }],
  "csrf_token": "<token>",
  "expires_at": "2026-10-05T10:15:00Z"
}

このトランザクションの状態を変更するすべてのリクエストでは、csrf_token を Idp-Csrf-Token ヘッダーで送り返してください。

認可リクエストで SSO が必要な組織が指定されている場合、回答はすでに federated_redirect と redirect_url になっている場合があります(接続が 1 つの場合: トップレベルウィンドウをそこへ移動してください)。または sso_connections を含む場合があります(複数の場合: sso_start 手順で選択内容を送信してください)。

DPoP にバインドされたヘッドレストランザクション

自社のオリジンで動作するファーストパーティの SPA またはネイティブアプリは、DPoP ヘッダー(RFC 9449)を付けてヘッドレスサインインを開始します。このプルーフは、クライアントが保持する鍵(ブラウザーでは抽出不可の WebCrypto 鍵、デバイスではプラットフォームの鍵ストア)で署名され、htm は POST、htu は https://<sign-in host>/fapi/v1/transactions です。トランザクションは Cookie ではなくその鍵にバインドされます。この場合 Cookie は設定されず、オブジェクトに csrf_token は含まれません。トランザクションの後続のすべてのリクエストでは、同じ鍵から新しいプルーフを送信してください。

認可エンドポイントのルールで検証される追加のボディフィールド:

Field Type Required Description
code_challenge string yes PKCE S256 チャレンジ(RFC 7636)。
code_challenge_method string yes S256。
scope string no スペース区切りのスコープ(例: openid profile email offline_access)。
state string no 認可コードとともに返されます。
nonce string no ID トークンの nonce。
organization string no 組織の ID または名前。
ui_locales string no 優先言語。
resource string (URI) no リソースインジケーター(RFC 8707)。

Origin はサインインホスト、またはアプリケーションの許可された Web オリジンのいずれかです。ネイティブアプリは何も送信しません。開始できるのはファーストパーティのアプリケーションだけです。認可エンドポイントが拒否したフィールドは、422 validation_failed を返し、errors[].code に OAuth エラーコードが含まれます。サーバーが 401 use_dpop_nonce を返した場合は、DPoP-Nonce レスポンスヘッダーの値を使って新しいプルーフに署名し、再試行してください。DPoP ヘッダーなしでこれらのフィールドを送信すると、422 validation_failed(dpop_required)を返します。

組織の切り替え

サインイン中のユーザーのフロント API アクセストークンを保持しているアプリケーション(フロント API アクセストークン を参照)は、画面を表示せずにユーザーを別の組織へ切り替えられます。トークンを Authorization: DPoP <token> で送信し、トークンの鍵のプルーフ(ath を含む)を添えてください。ボディには flow に organization_switch を指定し、上記の DPoP バインドされたヘッドレスフィールド(トークンのアプリケーションの client_id、redirect_uri、code_challenge、state、nonce、scope)と、GET /fapi/v1/me/organizations から取得した組織の org_… ID である organization を含めます。

このリクエストは、セッションを再利用するサインインと同様に、トークンのセッションを使って直ちに判定されます。判定対象は、組織のポリシー(MFA、アイドル制限、SSO、IP リスト)、同意、保留中の法的文書です。回答は 201 で、authorization_response を含む completed トランザクションです。その code を、code_verifier と同じ鍵のプルーフとともにトークンエンドポイントで交換してください。新しいトークンには org_id に組織が含まれます。開いたままのトランザクションは残らず、Cookie も設定されません。

{
  "schema_version": 1,
  "state": "completed",
  "next_steps": [],
  "authorization_response": { "code": "<code>", "state": "<state>", "iss": "https://example.keenauth.app" },
  "expires_at": "2026-10-05T10:15:00Z"
}
Status Code When
401 unauthenticated トークンが無効、期限切れ、取り消し済み、または鍵にバインドされていない、そのアプリケーションが有効なファーストパーティアプリケーションでない、またはそのセッションが終了している。
422 validation_failed flow が organization_switch でない、client_id がトークンのアプリケーションでない、organization が org_… ID でない、またはこのアプリケーションでユーザーがその組織へ切り替えられない(not_eligible)。
403 authorization_failed 組織が切り替えでは表示できない画面を必要とする。error は OAuth エラー(login_required、interaction_required、consent_required)。organization を設定して新しいサインインを開始してください。

トークンなしで flow に organization_switch を指定すると、422 validation_failed(access_token_required)を返します。

エラー

Status Code When
400 malformed_request Idp-Client がないか、ボディが有効な JSON ではない。
403 origin_not_allowed Origin がサインインホストではない。
403 headless_not_allowed サードパーティのアプリケーションがヘッドレスフローを開始しようとした。
404 not_found ホストがどの環境のサインインホストでもない。
422 validation_failed client_id がこの環境のアプリケーションではない、redirect_uri がそのアプリケーションに登録されていない、またはフィールドが無効。
401 invalid_dpop_proof DPoP プルーフがない、無効、または再利用されている、またはホストが DPoP にバインドされたトランザクションを提供していない。
401 use_dpop_nonce DPoP-Nonce レスポンスヘッダーの値を使って新しいプルーフに署名してください。
503 temporarily_unavailable 依存先が利用できない。後で再試行してください。

例

curl -X POST https://example.keenauth.app/fapi/v1/transactions \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H "Content-Type: application/json" \
  -c cookies.txt \
  -d '{"client_id":"<client_id>","redirect_uri":"https://app.example.com/callback"}'

個人データ

このエンドポイントは個人データを扱います: エンドユーザーのプロフィール。KeenAuth API の個人データ では、保存される内容、保存期間、削除方法を説明しています。特別な種類の個人データ(健康、生体データ、宗教、政治的意見、性的指向)はどのフィールドにも送信しないでください。