このページでは、Push! Passkeyの導入・実装・運用時に発生しやすい問題と、その確認手順を説明します。
調査は、利用者画面だけで判断せず、ブラウザの開発者ツール、顧客サイトのバックエンドログ、HTTPステータス、Push! Passkey APIのJSONレスポンス、request_idを組み合わせて行います。
APIキー、Cookie、セッションID、パスワード、APIの生レスポンスを利用者画面へ表示しないでください。
問い合わせや障害調査では、少なくとも次の情報を確認します。
| 段階 | 主な確認対象 |
|---|---|
| 画面表示前 | HTML、JavaScript読込、ボタン属性、CSP |
| ボタンクリック直後 | バックエンドエンドポイント、POST、JSON、session、CSRF |
| API接続時 | API URL、api_key、TLS、timeout、HTTP |
| 認証画面遷移時 | regist_url、auth_url、return_page_url |
| 結果確認時 | request_id、kind、domain、status、expired |
| ログイン完了時 | user_key、ユーザー状態、session、Cookie |
https://auth.jintec.com/js/passkey.js
<script src="https://auth.jintec.com/js/passkey.js" defer></script>
script-srcにPush! PasskeyのJavaScript配信元が許可されているか確認します。
必要以上に広いワイルドカードを許可せず、使用する接続先だけを追加してください。
<button type="button" class="push_btn auth" data-pushpasskey="auth" data-endpoint="/pushpasskey/endpoint" data-success-url="/login/callback"> パスキー認証 </button>
| 確認項目 | 確認内容 |
|---|---|
type |
buttonになっている |
data-pushpasskey |
registまたはauth |
data-endpoint |
顧客サイト内の正しいバックエンドエンドポイント |
data-success-url |
顧客サイト内の正しい遷移先 |
disabledが残っていないdata-endpointのパスと、実際の公開ディレクトリを確認します。
data-endpoint="/pushpasskey/endpoint"
顧客バックエンドエンドポイントがPOSTだけを許可しているか、WebサーバがPOSTを拒否していないか確認します。以下はPHPでの確認例です。
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
header('Allow: POST');
exit;
}
アプリケーションログ、設定ファイルの読込パス、構文・実行時エラー、権限、環境変数を確認します。
本番画面へバックエンドのエラー詳細を表示しないでください。
header('Content-Type: application/json; charset=UTF-8');
header('Cache-Control: no-store');
try {
$response = json_decode(
$response_body,
true,
512,
JSON_THROW_ON_ERROR
);
} catch (JsonException $e) {
throw new RuntimeException(
'APIの応答がJSONではありません。'
);
}
調査時はHTTPステータスと生レスポンスを内部ログへ一時的に記録できますが、APIキーや個人情報を除外してください。
https://auth.jintec.com/regist_url https://auth.jintec.com/auth_url https://auth.jintec.com/regist_result https://auth.jintec.com/auth_result
curl_setopt_array($curl, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Accept: application/json', ], CURLOPT_POSTFIELDS => $json_body, ]);
api_key_requiredinvalid_api_keyapi_keyである{
"api_key": "xxxxxxxxxxxxxxxx",
"user_key": "customer_user_123",
"return_page_url": "https://example.com/login/callback"
}
現在の正式仕様では、APIキーはAuthorizationヘッダーではなくJSON本文へ設定します。
登録対象ユーザーは、顧客サイトのログインセッションから取得します。
current_user = server_session.get_authenticated_user()
if current_user is not authenticated:
return login_required
user_key = current_user.external_authentication_key
ログイン前にメールアドレスなどを入力する構成では、顧客サイトのDBから対象ユーザーを検索し、Push! Passkey連携用のuser_keyへ変換します。
{
"api_key": "xxxxxxxxxxxxxxxx",
"user_key": "customer_user_123",
"return_page_url": "https://example.com/callback"
}
次のエラーはPush! Passkey側の内部処理に関係します。
DB_DOMAIN_SELECT_ERRORDB_REQUEST_INSERT_ERROR発生日時と可能であればrequest_idを記録し、連続再送を避けて管理者へ連絡してください。
登録URL発行ではregist_url、認証URL発行ではauth_urlが返されます。
{
"ok": true,
"request_id": "u_1234567890abcdef1234567890abcdef",
"auth_url": "https://auth.jintec.com/auth?u=...",
"expire_at": "2026-07-17T08:30:00+09:00"
}
https://から始まるpp_kindpp_request_idpp_statuspp_error_code戻り先ページでは、これらの値を画面表示だけに使わず、バックエンドの結果照会開始に使用します。
session.set("pushpasskey_transaction", {
"request_id": request_id,
"kind": kind,
"user_key": user_key,
"expire_at": expire_at,
"used": false
})
request_idと一緒に、顧客サイト側のテナント、環境、対象ドメインを保存してください。
結果照会時は、URL発行時と同じ設定からAPIキーを取得します。
| 開始処理 | 結果照会API |
|---|---|
regist_start |
https://auth.jintec.com/regist_result |
auth_start |
https://auth.jintec.com/auth_result |
ブラウザのpp_kindだけで照会先を決めず、顧客サイト側で保存したkindを使用してください。
登録URLと認証URLの有効期限は、発行から10分間です。
「認証の有効時間が終了しました。最初からやり直してください。」
issuedは、URL発行済みで、利用者による登録・認証処理がまだ開始されていない状態です。
in_progressは、利用者が登録・認証処理を開始したものの、まだ完了していない状態です。
一定時間後も変化しない場合は、利用者へ再試行を案内し、新しいURLを発行してください。
if (
$response['status'] === 'success'
&& $response['is_completed'] === true
&& $response['is_success'] === true
) {
// 顧客サイト側のログイン処理
}
session.rotate_id()
session.set("user_id", internal_user_id)
session.set("authenticated_at", current_time)
session.set("auth_method", "pushpasskey")
Push! Passkeyの認証成功だけでは、顧客サイトのログインセッションは自動発行されません。
SecureがHTTPS環境で使用されているHttpOnlyが設定されているSameSiteが遷移構成に合っているUPDATE pushpasskey_requests SET used = 1, used_at = CURRENT_TIMESTAMP WHERE request_id = :request_id AND used = 0;
CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2,
TLS検証を無効にして問題を回避しないでください。
CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => 15,
URL発行APIがタイムアウトした場合、Push! Passkey側で処理が完了している可能性があります。
無条件に即時再送せず、二重処理を防止し、回数と間隔を制限してください。
顧客サイトとPush! Passkeyの調査を対応付けるため、request_idを必ず記録してください。
| 項目 | 内容 |
|---|---|
| 発生日時 | タイムゾーンを含めて記録する |
| 環境 | 開発、検証、本番 |
| 対象ドメイン | APIキーに対応するドメイン |
| 処理種別 | registまたはauth |
| request_id | 存在する場合に記録する |
| HTTP | ステータスコード |
| error_code | JSONレスポンス内のコード |
| 再現手順 | 操作順を具体的に記録する |
| ブラウザ・OS | 名称とバージョン |
APIキー、Cookie、パスワード、個人情報は問い合わせ本文へ記載しないでください。
各error_codeの発生条件、確認項目、利用者向け表示を確認します。
正式なAPI URL、JSON項目、レスポンス項目を確認します。
request_id、kind、user_key、statusの照合とセッション発行を確認します。
Push! Passkeyの問題調査では、利用者画面だけを確認するのではなく、ブラウザ、顧客バックエンドエンドポイント、Push! Passkey API、結果照会、顧客サイトのセッション発行を順番に切り分けます。
HTTPステータス、JSON、error_code、request_idを確認すると、原因を特定しやすくなります。
期限切れや整合性エラーでは、古い処理を再利用せず、新しいURLを発行してください。
認証成功後も、顧客サイト側でuser_key、ユーザー状態、権限を確認し、セッションIDを再生成してログインを完了します。