このページでは、現在稼働しているPush! Passkeyの実装を正式仕様として、URL発行API、結果照会API、顧客サイトのバックエンド、利用者画面で扱うエラーコードを説明します。
エラー発生時は、プログラム側ではerror_codeを使って処理を分岐し、利用者画面には分かりやすい日本語メッセージを表示します。
APIキー、内部URL、SQL、サーバのファイルパス、スタックトレース、APIの生レスポンスは利用者画面へ表示しないでください。
同じエラーコードでも、発生したAPI、HTTPステータス、処理段階によって確認内容が異なります。ログにはrequest_id、処理種別、HTTPステータス、error_code、発生日時を記録してください。
{
"ok": false,
"error_code": "invalid_api_key",
"message": "APIキーが正しくありません。"
}
| 項目 | 型 | 内容 |
|---|---|---|
ok |
boolean | エラー時はfalse |
error_code |
string | プログラム側で判定するエラーコード |
message |
string | エラー内容を示すメッセージ |
APIから返されたmessageをそのまま利用者へ表示するのではなく、顧客サイト側で用途に応じた日本語メッセージへ置き換える方法を推奨します。
内部ログには調査に必要な情報を記録し、画面には次の行動が分かる内容だけを表示します。
| 用途 | 表示する情報 |
|---|---|
| 利用者画面 | 再試行方法、問い合わせ先、受付番号 |
| 内部ログ | request_id、kind、HTTP、error_code、発生日時、処理段階 |
| 分類 | 主な例 | 主な対応 |
|---|---|---|
| 入力エラー | 必須項目不足、JSON不正、action不正 | 入力値と送信形式を修正する |
| 認証・設定エラー | APIキー不正、ドメイン無効 | 管理ツールと設定ファイルを確認する |
| 整合性エラー | request_id、kind、domainの不一致 | 開始時に保存した情報と照合する |
| 期限エラー | URL・request_idの有効期限切れ | 新しいURLを発行する |
| 通信エラー | DNS、TLS、timeout、HTTP 5xx | 通信環境と接続先を確認する |
| 内部処理エラー | DB取得・登録エラー | request_idを記録し管理者が調査する |
登録URL発行APIと認証URL発行APIで確認されているエラーコードです。
| error_code | 発生条件 | 開発者が確認する項目 |
|---|---|---|
api_key_required |
JSON本文にapi_keyが指定されていない |
設定ファイルからAPIキーを読み込み、JSON本文へ設定しているか |
user_key_required |
JSON本文にuser_keyが指定されていない |
顧客サイトのセッションまたはDBからuser_keyを取得できているか |
invalid_api_key |
APIキーが不正、無効、または対象ドメインを利用できない | 管理ツールで発行したAPIキー、環境、対象ドメイン、コピー時の空白を確認する |
DB_DOMAIN_SELECT_ERROR |
Push! Passkey側でドメイン情報の取得に失敗 | request_idが存在する場合は記録し、時間をおいて再試行または管理者へ連絡する |
DB_REQUEST_INSERT_ERROR |
Push! Passkey側でURL発行リクエストの保存に失敗 | 同じ要求を連続送信せず、受付情報を記録して管理者へ連絡する |
APIキーは顧客サイトのバックエンドで設定します。
$api_request = [ 'api_key' => $config['api_key'], 'user_key' => $user_key, 'return_page_url' => $return_page_url, ];
ブラウザから受け取った値をAPIキーとして使用しないでください。
登録処理では、ログイン中のユーザーを顧客サイトのセッションから取得します。
認証開始時に利用者がメールアドレスなどを入力する構成でも、顧客DBで対象ユーザーを検索し、Push! Passkey連携用のuser_keyへ変換してください。
次の項目を確認します。
api_keyになっている登録結果照会APIと認証結果照会APIで確認されているエラーコードです。
| error_code | 発生条件 | 開発者が確認する項目 |
|---|---|---|
api_key_required |
JSON本文にapi_keyがない | URL発行時と同じドメイン用APIキーを設定しているか |
request_id_required |
JSON本文にrequest_idがない | URL発行APIのレスポンスから保存できているか |
invalid_api_key |
APIキーが不正または無効 | URL発行時と同じ環境・ドメイン用APIキーか |
request_not_found |
指定されたrequest_idが存在しない | 文字列の欠落、URLパラメータの改変、別環境のrequest_idを確認する |
request_domain_mismatch |
APIキーのドメインとrequest_idのドメインが一致しない | 別顧客・別ドメイン・別環境のAPIキーを使用していないか |
request_kind_mismatch |
登録request_idを認証結果APIへ送るなど、処理種別が一致しない | regist_resultとauth_resultの接続先、保存したkindを確認する |
REQUEST_EXPIRED |
request_idの有効期限切れ | 発行から10分を超えていないか、新しいURLを発行する |
DB_REQUEST_SELECT_ERROR |
Push! Passkey側でリクエスト情報の取得に失敗 | request_idと発生日時を記録し、管理者へ連絡する |
URL発行APIのレスポンスを受け取った時点で、次の情報を顧客サイトのセッションまたはDBへ保存してください。
[ 'request_id' => $request_id, 'kind' => $kind, 'user_key' => $user_key, 'expire_at' => $expire_at, 'used' => false, ]
リダイレクト後に受け取ったpp_request_idは、保存済みの値と一致することを確認します。
URL発行時に使用したAPIキーと、結果照会時に使用したAPIキーが異なるドメインに属している場合に発生します。
request_idを保存するときに、顧客サイト側のテナントIDや対象ドメインも一緒に保存し、結果照会時に同じ設定を使用してください。
| 開始処理 | 正しい結果照会API |
|---|---|
regist_start |
https://auth.jintec.com/regist_result |
auth_start |
https://auth.jintec.com/auth_result |
URL発行時にkindを保存し、その値から結果照会先を固定的に決定します。
$api_url = match ($kind) {
'regist' => $config['regist_result_api'],
'auth' => $config['auth_result_api'],
};
ブラウザから受け取ったpp_kindだけで結果照会先を決定せず、顧客サイト側で保存したkindと照合してください。
登録URLと認証URLの有効期限は、現在の正式仕様では発行から10分間です。
期限切れ後は古いURLやrequest_idを再利用せず、新しいURLを発行してください。
「認証の有効時間が終了しました。最初からやり直してください。」
期限切れのrequest_idを使って結果照会を繰り返しても成功しません。
顧客サイト側でポーリングしている場合は、expiredまたはREQUEST_EXPIREDを受け取った時点でポーリングを停止します。
次のエラーコードは、顧客サイトのバックエンドで入力、認証状態、セッションを検証するときに使用する例です。
| error_code | 内容 | 推奨HTTP |
|---|---|---|
method_not_allowed |
POST以外のHTTPメソッド | 405 |
unsupported_media_type |
Content-Typeがapplication/jsonではない | 415 |
empty_request |
リクエスト本文が空 | 400 |
invalid_json |
JSON形式が不正 | 400 |
invalid_action |
許可されていないaction | 400 |
login_required |
登録処理に必要なログインセッションがない | 401 |
csrf_failed |
CSRFトークンが不正 | 403 |
invalid_request |
入力値、return_page_url、型などが不正 | 400 |
server_error |
予期しない内部エラー | 500 |
regist_startauth_startregist_resultauth_result利用者には内部詳細を表示せず、問い合わせ用の受付番号を返します。
{
"ok": false,
"error_code": "server_error",
"message": "処理を完了できませんでした。受付番号:a1b2c3d4"
}
| 状態 | 確認内容 |
|---|---|
| DNSエラー | auth.jintec.comの名前解決、DNS、プロキシを確認する |
| TLSエラー | CA証明書、サーバ時刻、接続先ホスト名を確認する |
| 接続タイムアウト | CURLOPT_CONNECTTIMEOUT、FW、経路を確認する |
| 応答タイムアウト | CURLOPT_TIMEOUT、API負荷、ネットワーク遅延を確認する |
| HTTP 405 | POSTで送信しているか、APIパスが正しいか確認する |
| HTTP 500 | 時間をおいて再試行し、request_idと発生日時を記録する |
| JSONではない応答 | 接続先間違い、WebサーバのHTMLエラー、プロキシ応答を確認する |
| 必要項目不足 | request_id、regist_url、auth_url、statusなどを確認する |
try {
$response = json_decode(
$response_body,
true,
512,
JSON_THROW_ON_ERROR
);
} catch (JsonException $e) {
throw new RuntimeException(
'Push! Passkey APIの応答がJSONではありません。'
);
}
Webサーバの405や500ページがHTMLで返された場合も、API成功として扱わないでください。
| 状態 | 表示例 |
|---|---|
| APIキー・設定エラー | 「現在この機能を利用できません。管理者へお問い合わせください。」 |
| request_id不一致 | 「認証結果を確認できませんでした。最初からやり直してください。」 |
| 期限切れ | 「認証の有効時間が終了しました。最初からやり直してください。」 |
| 通信エラー | 「通信に失敗しました。時間をおいて再度お試しください。」 |
| 認証失敗 | 「認証を完了できませんでした。もう一度お試しください。」 |
| 内部エラー | 「処理を完了できませんでした。受付番号:XXXXXXXX」 |
| エラー | 自動再試行 | 対応 |
|---|---|---|
api_key_required |
不可 | 実装・設定を修正する |
invalid_api_key |
不可 | 管理ツールとAPIキーを確認する |
request_not_found |
不可 | request_idを確認し、新しい処理を開始する |
request_domain_mismatch |
不可 | APIキーと環境を修正する |
request_kind_mismatch |
不可 | 結果照会先を修正する |
REQUEST_EXPIRED |
同じrequest_idでは不可 | 新しいURLを発行する |
| timeout | 条件付き | 二重処理を避け、状態確認後に再試行する |
| HTTP 5xx | 条件付き | 間隔を空け、回数を制限して再試行する |
URL発行APIがタイムアウトした場合、Push! Passkey側でリクエスト保存まで完了している可能性があります。
無条件に連続再送せず、顧客サイト側で二重送信防止と受付ログを実装してください。
$error_code =
$response['error_code'] ?? 'unknown_error';
$user_message = match ($error_code) {
'REQUEST_EXPIRED' =>
'認証の有効時間が終了しました。'
. '最初からやり直してください。',
'request_not_found',
'request_domain_mismatch',
'request_kind_mismatch' =>
'認証結果を確認できませんでした。'
. '最初からやり直してください。',
'invalid_api_key',
'api_key_required' =>
'現在この機能を利用できません。'
. '管理者へお問い合わせください。',
default =>
'処理を完了できませんでした。'
. '時間をおいて再度お試しください。',
};
error_log(json_encode([
'timestamp' => date('c'),
'request_id' => $request_id,
'kind' => $kind,
'http_status' => $http_status,
'error_code' => $error_code,
], JSON_UNESCAPED_UNICODE));
APIキーやCookieをログ配列へ追加しないでください。
HTTP 405、JSONではない応答、APIキー不正、結果照会できない場合の具体的な確認手順を案内します。
各APIの正式なURL、リクエスト項目、レスポンス項目を確認します。
request_id、kind、user_key、statusの照合とセッション発行を確認します。
Push! Passkey APIでエラーが発生した場合は、HTTPステータスとJSON本文のerror_codeを確認します。
URL発行APIでは、APIキー、user_key、ドメイン情報、リクエスト保存に関するエラーが発生します。
結果照会APIでは、request_id、ドメイン、処理種別、有効期限、DB取得に関するエラーが発生します。
利用者向けには再試行方法が分かるメッセージを表示し、内部ログにはrequest_id、kind、HTTP、error_code、発生日時を記録してください。
APIキー、Cookie、パスワード、内部構成情報は、画面にもログにも出力しないでください。