🪪
PHPでデジタル認証アプリ認可URLを生成する
はじめに
ランサーズでサーバーサイドエンジニアをやっているeccyunです。
最近はプロジェクトマネジメント業務も頑張っています。
2025年7月16日より、ランサーズの本人確認方法として、新たにマイナンバーカードの公的個人認証サービス(JPKI)を導入しました。
【より速く、より安全に】マイナンバーカードによる本人確認を導入しました
https://info.lancers.jp/34066
連携の実現にあたり、デジタル庁が提供するデジタル認証アプリを採用しています。
本記事では、このデジタル認証アプリとの連携において、OpenID Connect認可フローの開始部分である認可URLの生成とリダイレクト処理の実装方法について解説します。
前提条件
デジタル認証アプリの事前申請が完了していることを前提に解説しています。
参考:デジタル認証アプリサービスの事前準備契約の申込について
実装
設定情報の準備
デジタル認証アプリとの連携にあたり認可URLの生成に必要な設定情報を準備します。
<?php
    // 設定情報
    $clientId = 'your_client_id';  // 申請時に取得したクライアントID
    $authServerBaseUrl = 'https://sb-auth-and-sign.go.jp/api';  // 認証サーバーURL
    $callbackUri = 'https://example.com/callback';  // コールバックURL
注意点
- 実運用にあたっては、設定値は環境変数など安全なやり方で管理し、ソースコードに直接記載しないでください。
 
認可URLの生成
PKCE(Proof Key for Code Exchange)用パラメータの生成
    $randomBytesString = openssl_random_pseudo_bytes($byteLength);
    $encodedRandomString = base64_encode($randomBytesString);
    $urlSafeEncoding = [
        '=' => '',
        '+' => '-',
        '/' => '_',
    ];
    $codeVerifier = strtr($encodedRandomString, $urlSafeEncoding);
    $hash = hash('sha256', $codeVerifier, true);
    $codeChallenge = str_replace('=', '', strtr(base64_encode($hash), '+/', '-_'));
ステート, ナンスの値生成
    $state = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');
    $nonce = rtrim(strtr(base64_encode(random_bytes(32)), '+/', '-_'), '=');
セッション管理
後々、コールバック時の検証に利用するため、セッションに値を保持します。
    session_start();
    $_SESSION["code_verifier"] = $codeVerifier;
    $_SESSION["state"] = $state;
    $_SESSION["nonce"] = $nonce;
注意点
- 実運用にあたっては、各値を暗号化してください
 
認可URLを構築し、ユーザーを認証URLにリダイレクト
    // 認証リクエストのクエリパラメータを設定
    $queryParameters = [
        'response_type' => 'code',
        'scope' => 'openid name address birthdate gender',
        'client_id' => $clientId,
        'redirect_uri' => $redirectUri,
        'state' => $state,
        'nonce' => $nonce,
        'code_challenge' => $codeChallenge,
        'code_challenge_method' => 'S256',
        'acr_values' => 'aal3 crl',
    ];
    
    // 認可URLを生成
    $authUrl = $authServerBaseUrl . '/realms/main/protocol/openid-connect/auth?' . http_build_query($queryParameters);
    
    // ユーザーをデジタル認証アプリの認証画面にリダイレクト
    header("Location: $authUrl");
    exit;
認可URLに含まれるパラメータの詳細
記事作成時点の情報なので、正確な情報はデジタル認証アプリAPIリファレンス(民間事業者向け)を確認してください。
| パラメータ | 値 | 説明 | 
|---|---|---|
| response_type | code | OpenID Connectの認可コードフローを指定(固定値) | 
| scope | openid name address birthdate gender | 取得したい情報のスコープ。openidは必須 | 
| client_id | 申請時に取得した値 | デジタル認証アプリサービスから発行されたクライアントID | 
| redirect_uri | コールバックURL | 認証完了後にリダイレクトされるURL | 
| state | ランダム値 | CSRF対策用。リクエストとコールバックで同じ値を使用 | 
| nonce | ランダム値 | リプレイアタック対策用 | 
| code_challenge | code_verifierのハッシュ値 | PKCE用チャレンジ値 | 
| code_challenge_method | S256 | チャレンジ値の生成方法(固定値) | 
| acr_values | aal3 crl または aal3 ocsp | 認証レベルと失効確認方法の指定 | 
実行
テスト環境の場合は、認証テストレスポンス設定画面に遷移します。
感想
リファレンス資料が整っている点と、デジタル庁様のサポートが迅速丁寧だったこともあって、基本的な開発をかなりスムーズに進めることができました。
Discussion