メインコンテンツまでスキップ

券面事項情報の検証

このページでは、PocketSign Verify API を使用して券面事項確認 AP から取得した公開鍵・署名値・券面事項情報のデータを用いて、 マイナンバーカードの表面に記載されている情報(氏名画像、住所画像、生年月日、性別、顔画像、有効期限、セキュリティコード画像)の取得を行う方法を説明します。

あらかじめAPI の利用開始を完了し、API トークンを取得しておいてください。 また、利用の前に券面事項系 API の利用についてお問い合わせください。

シーケンス

アプリとバックエンドの連携

Verify SDK を用いて取得した公開鍵・署名値・券面事項情報などの情報は、 何らかの方法でバックエンドサーバーに共有してデータのパース・検証を行ってください。

以下の実装例では、アプリとバックエンドの間での連携については省略しています。 実際のアプリケーションの実装例については、サンプルアプリをご覧ください。

要確認

Verify API の利用は、必ず バックエンドサーバーを経由して行ってください。 API トークンをアプリケーションに含めて配布することは Verify API の不正利用につながるため、絶対に行わないでください

実装例

クライアントライブラリのセットアップ方法は、クライアントライブラリをご参照ください。

package main

import (
"context"
"crypto/sha256"
"encoding/base64"
"fmt"
"log"
"net/http"

"buf.build/gen/go/pocketsign/apis/connectrpc/go/pocketsign/cardinfo/v1/cardinfov1connect"
cardinfov1 "buf.build/gen/go/pocketsign/apis/protocolbuffers/go/pocketsign/cardinfo/v1"
verifyv2 "buf.build/gen/go/pocketsign/apis/protocolbuffers/go/pocketsign/verify/v2"
"connectrpc.com/connect"
)

var (
// APIエンドポイントを指定します。この値は環境によって異なります。
baseUrl = "https://verify.mock.p8n.app"

// Verify APIのトークンです。ご自身のトークンに置き換えてください。
token = "<YOUR_API_TOKEN>"

// チャレンジとして送信したNonceです。
nonce = []byte{0xCA, 0xFE, 0xBA, 0xBE}

// Verify SDKによって券面事項確認APから読み出されたデータです。これらの値は、アプリ上で作成したものを何らかの方法で予め受け取っておいてください。
rawVerificationPublicKey = "fyGCAjNfToIBKTEwMDAwMDEIBTAwMQAAAAAyODgyMzUyCAUwMDEAAAAAkAMBAAGRggEAmfy3KTSqU9QSwA05TehkOph/DhxrfPMd3opwsfjoHulVXtEsgFG8J+har+/dI2Pb165pQia7OhJiYHrdzgPq0A3eGx50rOhzTTV+weQZ1XOLzprsB6BN9oaI1kG3BFrl6WLZbbUs73DiljJPbshcJK4rka4RwW9BP6Ohp483Tt/KGK8VkZfGxtJsb2HbHluJUtSeR0Tp2zm/f9OUi35Oj68npEOuRzWssvsJNuaS7bq5calMsx24ed7WaQ5/H/s5r+scibFALGhBpzed5gi3GQAP8Drse7KIGCpr/BxX5k7Qtx2y9TBSTwGVoQbEpFvf2QLPI1Dcod259KhXE3lHJV83ggEAK2KsvW3L/1WQBQdnIcWXF6bTOrlaZdyereK+ySbvM0xJWCKnTqvfsJJTM6a6LAkDsyXwxaKSe1FKGnUhzo1sUyeKs0wE+GTaA4tNUm98m6gN1Ca/uLN7BFRc5G8WJ5Cs/wz9OkY9lAY0FrBaUfsQuZedKn/1TG6eClJRlxUwvh8LXzf+xjH6Ao0vmBJR1f9OYmlra/lgF1UQqgybcJHvg/7iXOAFHOEQGavF5J7GO/BxIaLVEwzT9mykCGqwArvddn6e0mX6aX0yUwZuMXonGXD8MzN4uU1pco6biZdoR++O/8eWK/+KJFqNUglAO61DCgvNdOHXN/tKdO8QtdzHUg=="
rawAuthenticationSignaure = "SPzVptSYxa56R2nyMldup21y/RBuJj7GjwTxRMkY2O19NKysI4NaV1RRmXpbsTL0SBVucFvkUKs8xL5At92WKsfY92nDSeJkCMBHAa9lcep8NEdEBNNb9yOe2wWHSkJ3NoudgFC9Bp7e9vmOmpAsSIEkJzciBTfnkmGvnu4wdshAqEXIbteQrbm7s5OyKJLZxlWZIBP9Il/G/RFOYw45Q299t5hjjIanCJCBx9eNuuZk+n8y8pQJNZFnt6y46NDC2R+qTkV/2bssiwr0s3hEMytbu6GE8xq0m8bChA218mp5d4aZn/E9uCJbZUJbejCvUhNzWbxZJ5+ROvLf7B1GdA=="
rawPersonalInfoContent = "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"
)

func run() error {
// Base64をデコードしてバイト列にします。
verificationPublickey, err := base64.StdEncoding.DecodeString(rawVerificationPublicKey)
if err != nil {
return err
}
authenticationSignature, err := base64.StdEncoding.DecodeString(rawAuthenticationSignaure)
if err != nil {
return err
}
personalInfoContent, err := base64.StdEncoding.DecodeString(rawPersonalInfoContent)
if err != nil {
return err
}

// Nonceのハッシュ値を計算します。
digest := sha256.Sum256(nonce)

// 券面事項情報パースリクエストを作成します。
request := connect.NewRequest(&cardinfov1.ParsePersonalInfoContentRequest{
// 券面事項確認APから読み出されたデータを設定します。
VerificationPublickey: verificationPublickey,
AuthenticationSignature: authenticationSignature,
PersonalInfoContent: personalInfoContent,
// 作成したハッシュ値を送信します。
// もし、内部認証でNonceと異なる値が署名されていた場合はハッシュ値が一致しないため、検証に失敗します。
Digest: digest[:],
HashAlgorithm: verifyv2.Verification_HASH_ALGORITHM_SHA256,
})

// リクエストにAPIトークンを設定します。
request.Header().Set("Authorization", "Bearer "+token)

// APIクライアントを作成します。
client := cardinfov1connect.NewConfirmationServiceClient(http.DefaultClient, baseUrl)

// 券面事項情報のパースリクエストを送信します。
response, err := client.ParsePersonalInfoContent(context.Background(), request)
if err != nil {
return err
}

// 結果を表示します。
fmt.Println("券面事項情報(氏名画像、住所画像、生年月日、性別、顔画像、有効期限、セキュリティコード画像)")
fmt.Printf("CommonNameImage: %s\n", base64.StdEncoding.EncodeToString(response.Msg.GetPersonalInfo().GetCommonNameImage()))
fmt.Printf("AddressImage: %s\n", base64.StdEncoding.EncodeToString(response.Msg.GetPersonalInfo().GetAddressImage()))
fmt.Printf("DateOfBirth: %s\n", response.Msg.GetPersonalInfo().GetDateOfBirth())
fmt.Printf("Gender: %s\n", response.Msg.GetPersonalInfo().GetGender())
fmt.Printf("FaceImage: %s\n", base64.StdEncoding.EncodeToString(response.Msg.GetPersonalInfo().GetFaceImage()))
fmt.Printf("ExpirationDate: %s\n", response.Msg.GetPersonalInfo().GetExpirationDate())
fmt.Printf("SecurityCodeImage: %s\n", base64.StdEncoding.EncodeToString(response.Msg.GetPersonalInfo().GetSecurityCodeImage()))
return nil
}

func main() {
if err := run(); err != nil {
log.Fatalln(err)
}
}

パース・検証に成功すると、以下のように結果が表示されます。 取得した券面事項情報は、対面でのマイナンバーカード表面に記載されている情報の正確性の確認などに使用することができます。 出力された券面事項情報のフォーマットに関しては本番環境をご参照ください。

注意

モック環境では、券面事項確認 AP によって読み出された氏名画像、住所画像に記載されている氏名、住所と、 券面事項入力補助 AP からの読み出しによって得られる氏名、住所が異なります。

モック環境の券面事項確認 AP から読み出される画像はダミー画像となっており、カードによらず同じ画像が読み出されます。

CommonNameImage: iVBORw0KGgoAAAANSUhEUgAAANgAAAAMAQAAAAAo9E55AAAAYUlEQVQY032QoRGAMBAE0xElpDNSB4oOaCF0kBKQSAQizAB5Ds4dkBe7YtW9s/9z++AhUtvWJIjUlmOGSG1LvEVq61o/eiO1lTBB5Ks9Kp8bziNApLbVeojUlmyGSG2Vn11ppDRSmKox9AAAAABJRU5ErkJggg==
AddressImage: iVBORw0KGgoAAAANSUhEUgAAASAAAAAMAQAAAADq4V3UAAAA40lEQVQY03XRMQ6CMBQGYIxDj8DoEUwcHOUIXsDEAzgwMhip13BidHN3whtwBNgYSKjEhJIU+H2vHTQRmz9faPKnKa8ePkviz/LMLcAo9I4aki1kgwUF1saVumWGVj/3CYo5W83rUVFgrV1JpxqtUFLRSWwV5idNwcDm9gqeSkEn8aYTbDFVusTBYy1WvTwfI/YQ1nFJeWzY2pVGmdNJPVKYiK3CRvoUwLcfrkS0YiBNxFYh/SUHVlcaeklb03GJnbzTCwmesxIBzJaFmhhBhhLDNUFGI7CqiWEyr/vXs2S/z/IGdNxor/DFiYoAAAAASUVORK5CYII=
DateOfBirth: 19850526
Gender: 2
FaceImage: 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
ExpirationDate: 20320526
SecurityCodeImage: iVBORw0KGgoAAAANSUhEUgAAABgAAAAMAQAAAABQS0DYAAAAN0lEQVQI12P4//8/wz2L3wyy14sZ7t4vZrh/5zXD/f3ZDPfroxnufXdkuPu9muGOxG8GkDogBgB9ORtbirvg/QAAAABJRU5ErkJggg==

次のステップ

その他、API の詳しい使い方やエラーの詳細等については、API リファレンスをご覧ください。