このページでは、Push! Passkeyで実行されたパスキー登録・認証の結果を、顧客サイト側で安全に受け取る方法を説明します。
登録URLまたは認証URLが発行された時点では、パスキー処理はまだ完了していません。
利用者がPush! Passkey認証画面で操作し、WebAuthnの検証が完了した後に、登録・認証結果が確定します。
顧客サイトは、URL発行時に取得したrequest_idを保存し、登録結果照会APIまたは認証結果照会APIへ送信して処理結果を確認します。
認証成功後のログインセッションは、Push! Passkeyではなく顧客サイト側で発行します。
顧客サイトが次のAPIへ要求し、登録URLまたは認証URLを取得できた時点では、利用者によるパスキー操作はまだ開始または完了していません。
| 用途 | API |
|---|---|
| 登録URL発行 | https://auth.jintec.com/regist_url |
| 認証URL発行 | https://auth.jintec.com/auth_url |
URL発行APIのレスポンスに含まれるrequest_idは、後で処理結果を照会するための識別子です。
request_idを保存する
認証URL発行APIのレスポンス例は次のとおりです。
{
"ok": true,
"kind": "auth",
"request_id": "u_1234567890abcdef1234567890abcdef",
"auth_url": "https://auth.jintec.com/auth?u=u_1234567890abcdef1234567890abcdef",
"expire_at": "2026-07-17T08:30:00+09:00"
}
登録URL発行の場合は、kindがregistとなり、URL項目名はregist_urlになります。
顧客サイトでは、少なくとも次の項目を保存します。
| 項目 | 用途 |
|---|---|
request_id |
結果照会APIへ送信し、開始した処理と結果を対応付ける |
kind |
登録または認証の処理種別を照合する |
expire_at |
URLとトランザクションの有効期限を確認する |
| 使用済み状態 | 同じ成功結果を複数回使用しないようにする |
session.set("pushpasskey_transaction", {
"request_id": request_id,
"kind": "auth",
"expire_at": expire_at,
"used": false
})
Webhook、複数サーバ、監査ログ、長時間の結果確認が必要な場合は、セッションではなくDBへ保存します。
request_idには一意制約を設定し、同じ結果の重複処理を防止してください。
認証開始時点ではユーザーは未確定です。認証結果が成功したときに返るuser_keyを使って顧客サイトのユーザーDBを検索し、状態と権限を確認してからセッションを発行します。
登録URLと認証URLの有効期限は、現在の正式仕様では発行から10分間です。
Push! Passkey認証画面から顧客サイトへ戻る際、次のURLパラメータが使用されます。
| パラメータ | 内容 |
|---|---|
pp_kind |
登録または認証の処理種別 |
pp_request_id |
結果照会に使用するrequest_id |
pp_status |
認証画面側での処理状態 |
pp_error_code |
失敗時のエラーコード |
URL例は次のとおりです。
https://example.com/login/callback ?pp_kind=auth &pp_request_id=u_1234567890abcdef1234567890abcdef &pp_status=success &pp_error_code=
pp_status=successが付いていても、それだけを根拠にログインセッションを発行してはいけません。
URLパラメータは、顧客サイトが結果照会を開始するための情報として使用します。
顧客サイトのバックエンドから、pp_request_idを使って認証結果照会APIを呼び出し、正式な結果を確認してください。
URLパラメータは利用者が変更できます。
pp_request_idが、顧客サイト側で保存したrequest_idと一致することを確認してください。
| 用途 | API |
|---|---|
| 登録結果照会 | https://auth.jintec.com/regist_result |
| 認証結果照会 | https://auth.jintec.com/auth_result |
結果照会APIには、URL発行時と同じドメイン用APIキーとrequest_idを送信します。
{
"api_key": "管理ツールで発行したAPIキー",
"request_id": "u_1234567890abcdef1234567890abcdef"
}
| 項目 | 必須 | 内容 |
|---|---|---|
api_key |
必須 | URL発行時に使用した対象ドメイン用APIキー |
request_id |
必須 | URL発行APIから返された識別子 |
APIキーはHTTPヘッダーではなく、現在の正式仕様ではJSON本文のapi_keyへ設定します。
APIキーを設定するのは顧客サイトのバックエンドです。ブラウザから受け取った値をAPIキーとして使用してはいけません。
{
"ok": true,
"kind": "auth",
"request_id": "u_1234567890abcdef1234567890abcdef",
"status": "success",
"user_key": "customer_user_123",
"tenant_id": 1,
"domain_id": 10,
"personal_id": 100,
"issued_at": "2026-07-17 08:10:00",
"started_at": "2026-07-17 08:10:05",
"completed_at": "2026-07-17 08:10:12",
"expire_at": "2026-07-17 08:20:00",
"return_page_url": "https://example.com/login",
"return_to": {
"regist_success": "",
"regist_failed": "",
"auth_success": "",
"auth_failed": ""
},
"fallback_url": "/passkey_callback.html",
"error_code": "",
"error_message": "",
"is_completed": true,
"is_success": true,
"is_failed": false,
"is_expired": false
}
| 項目 | 内容 |
|---|---|
ok |
結果照会API自体が正常に処理されたか |
kind |
登録または認証の処理種別 |
request_id |
対象トランザクションの識別子 |
status |
現在の処理状態 |
user_key |
顧客サイトから連携されたユーザー識別子 |
issued_at |
登録・認証URLを発行した日時 |
started_at |
利用者が処理を開始した日時 |
completed_at |
処理が完了した日時 |
expire_at |
処理の有効期限 |
error_code |
失敗時のエラーコード |
error_message |
失敗時のエラー内容 |
is_completed |
処理が完了状態か |
is_success |
処理が成功したか |
is_failed |
処理が失敗したか |
is_expired |
処理が期限切れか |
| status | 内容 | 顧客サイト側の主な処理 |
|---|---|---|
issued |
URL発行済み、利用者による処理開始前 | 処理中として待機または再照会する |
in_progress |
登録・認証処理中 | 完了するまで待機または再照会する |
success |
登録・認証が正常終了 | 照合後に登録完了処理またはセッション発行を行う |
failed |
登録・認証が失敗 | error_codeを記録し、利用者へ再試行を案内する |
expired |
有効期限切れ | 古い処理を使用せず、新しいURLを発行する |
処理完了と成功を確認するときは、次の条件を確認します。
if (
$response['status'] === 'success'
&& $response['is_completed'] === true
&& $response['is_success'] === true
) {
// 成功時の処理
}
ok=trueは、結果照会APIが正常に応答したことを示します。パスキー登録・認証の成功は、statusと判定用フラグで確認してください。
認証結果が成功していても、顧客サイトが開始した処理と一致することを確認してから後続処理を行います。
request_idが顧客サイトで保存した値と一致するkindが開始した登録・認証の種別と一致するuser_keyが登録開始時の対象ユーザーと一致するuser_keyに対応する有効なユーザーが顧客DBに存在するstatusが期待する状態であるis_completedが正しいis_successがtrueであるtransaction = session.get("pushpasskey_transaction")
if (!is_array($transaction)) {
throw new RuntimeException(
'開始した認証情報が見つかりません。'
);
}
if (
!hash_equals(
$transaction['request_id'],
$response['request_id']
)
) {
throw new RuntimeException(
'request_idが一致しません。'
);
}
if ($response['kind'] !== $transaction['kind']) {
throw new RuntimeException(
'処理種別が一致しません。'
);
}
if ($response['kind'] === 'regist' && !hash_equals(
$transaction['user_key'],
$response['user_key']
)) {
throw new RuntimeException('登録対象のuser_keyが一致しません。');
}
if ($response['kind'] === 'auth' && empty($response['user_key'])) {
throw new RuntimeException('認証ユーザーを確認できません。');
}
if ($transaction['used'] === true) {
throw new RuntimeException(
'この認証結果は使用済みです。'
);
}
request_idや登録時のuser_keyなど、保存値との比較には必要に応じてhash_equals()を使用します。認証時のuser_keyは事前値と比較するのではなく、顧客DBのユーザー検索キーとして扱います。
登録結果が成功した場合は、顧客サイト側で必要に応じて次の処理を行います。
Credential IDと公開鍵そのものはPush! Passkey側で管理されます。
status=failedの場合は、error_codeを内部ログへ記録し、利用者には分かりやすい日本語メッセージを表示します。
登録成功は、新しいパスキーの登録が完了したことを示します。
登録成功だけを根拠に、新しいログインセッションを発行する設計にする場合は、登録前の本人確認と現在のセッション状態を慎重に確認してください。
Push! Passkeyの認証結果が成功しても、顧客サイトのユーザーが現在ログイン可能とは限りません。
セッション発行前に、顧客サイトのDBで次の状態を確認します。
管理者権限や有料機能の利用可否は、顧客サイト側で判断します。
結果照会とユーザー状態確認が完了した後に、顧客サイトのログインセッションを発行します。
session.rotate_id()
session.set("user_id", internal_user_id)
session.set("authenticated_at", current_time)
session.set("auth_method", "pushpasskey")
session.set("pushpasskey_transaction.used", true)
セッションCookieには、利用環境に応じて次の属性を設定します。
SecureHttpOnlySameSiteセッション発行と同時に、対象request_idを使用済みへ更新します。
ブラウザの再読み込み、戻る操作、同じURLへの再アクセスによって、同じ認証結果から複数のセッションを発行しないようにしてください。
認証成功結果を複数回使用できると、ブラウザの再読み込みやURL共有によって、意図しないセッション発行が行われる可能性があります。
顧客サイト側で、各request_idの使用状態を管理してください。
UPDATE pushpasskey_requests SET used = 1, used_at = CURRENT_TIMESTAMP WHERE request_id = :request_id AND used = 0;
更新件数が0件の場合は、すでに使用済みである可能性があります。
複数リクエストが同時に同じ結果を処理する可能性がある場合は、DBトランザクション、一意制約、条件付きUPDATEなどで排他制御します。
return_page_urlを指定すると、Push! Passkeyでの処理後に利用者を顧客サイトへ戻せます。
リダイレクト方式は、利用者のブラウザ操作と連続して結果確認を行う場合に適しています。
pp_request_idを取得する処理完了後は、pp_request_idなどがブラウザのアドレス欄へ残り続けないように、通常のログイン後URLへリダイレクトする方法を推奨します。
一時パラメータを含むページから外部サイトへ遷移する前に、パラメータを除去してください。
利用者が別端末で認証する場合や、同じ画面で完了を待つ場合は、結果照会APIを一定間隔で呼び出す方法があります。
短すぎる間隔で照会すると、顧客サイトとPush! Passkey双方へ不要な負荷がかかります。
数秒間隔など、利用者体験と負荷のバランスを考慮した間隔を設定してください。
is_completed=trueになったstatus=successになったstatus=failedになったstatus=expiredになった完了後はポーリングを停止してください。
Webhookを利用すると、利用者のブラウザ操作とは別に、Push! Passkeyから顧客サイトのバックエンドへ結果通知を受け取る構成にできます。
Webhookは、次のような構成に適しています。
Webhookの内容だけを無条件に信用せず、送信元検証、署名検証、request_id照合、重複受信対策を行います。
現在の実装で使用するWebhookの正式な通知項目、署名形式、再送仕様は、APIリファレンスで定義します。
同じWebhookが複数回届いても、同じ登録完了処理やセッション関連処理を重複実行しないようにします。
ブラウザに対するログインセッション発行は、通常は利用者のリダイレクト後処理で行います。Webhookだけで利用者ブラウザのCookieを発行することはできません。
| 方式 | 適した用途 | 注意点 |
|---|---|---|
| リダイレクト | 同じブラウザで認証し、そのままログインを完了する | URLパラメータだけで成功判定しない |
| ポーリング | 別端末認証や完了待ち画面を表示する | 照会間隔、停止条件、タイムアウトを設定する |
| Webhook | 非同期処理、DB更新、通知、監査ログ | 送信元検証、重複受信、再送を考慮する |
複数方式を併用することもできます。
例えば、Webhookで結果をDBへ保存し、利用者が戻った際に顧客サイトのDBと結果照会APIを確認してセッションを発行する構成があります。
結果照会APIでは、少なくとも次のエラーコードを処理します。
| error_code | 内容 |
|---|---|
api_key_required |
APIキーが指定されていない |
request_id_required |
request_idが指定されていない |
invalid_api_key |
APIキーが不正または無効 |
request_not_found |
対象request_idが存在しない |
request_domain_mismatch |
APIキーのドメインとリクエストのドメインが一致しない |
request_kind_mismatch |
登録・認証の処理種別が一致しない |
REQUEST_EXPIRED |
リクエストの有効期限切れ |
DB_REQUEST_SELECT_ERROR |
リクエスト情報の取得に失敗 |
| 状態 | 表示例 |
|---|---|
| 失敗 | 「認証を完了できませんでした。もう一度お試しください。」 |
| 期限切れ | 「認証の有効時間が終了しました。最初からやり直してください。」 |
| 結果不一致 | 「認証結果を確認できませんでした。」 |
| 通信エラー | 「通信に失敗しました。時間をおいて再度お試しください。」 |
内部のerror_code、APIの生レスポンス、APIキー、ファイルパスは、利用者向け画面へ表示しないでください。
request_idを共通の追跡値として使用すると、顧客サイト側のログとPush! Passkeyのトランザクションを照合しやすくなります。
結果照会、トランザクション照合、ユーザー状態・権限確認、セッション発行は、利用するバックエンド言語の実装ページを参照してください。
URL発行APIと結果照会APIの正式なリクエスト項目、レスポンス項目、HTTPステータスを確認します。
URL発行、登録、認証、結果照会で返されるエラーコードを確認します。
結果を取得できない、statusが変化しない、セッションを発行できない場合の確認方法を案内します。
Push! Passkeyの登録・認証結果を安全に利用するためには、URL発行時に取得したrequest_idを保存し、顧客サイトのバックエンドから結果照会APIを呼び出します。
結果処理で重要となる点は次のとおりです。
Push! Passkeyはパスキー認証結果を提供し、顧客サイトはその結果を確認して、自社サービスのログイン状態と権限を確定します。