申込情報の検証
このページでは、PocketSign Stamp を利用して、利用者が申込情報に対して行った署名の検証を要求し、検証結果を確認する方法を説明します。
シーケンス
- 利用者は、事業者バックエンドへ署名が完了したことを通知します。
- 事業者バックエンドは、Stamp API へ署名の検証を要求します。
- Stamp API は、PocketSign Verify API により署名の検証を行います。
- Stamp API は、署名の検証結果を事業者バックエンドへ返却します。
- 事業者バックエンドは、申込等の結果を利用者に通知します。
実装例
ここでは、事業者バックエンド側から Stamp API へ署名の検証を要求し、その結果を確認する実装例を示します。
こちらの実装例で利用している API については、セッションの終了をご参照ください。
- TypeScript
- Go
// Stamp Web サイトからのコール バックリクエストを受け取るエンドポイントです。
app.get('/callback', async (c) => {
try {
// セッションを終了し、結果を取得します。
const resp = await client.finalizeSession(
{
// コールバック URL にクエリパラメータ `session_id` として追加された署名セッションIDを指定します。
id: c.req.query('session_id'),
},
{
headers: {
Authorization: `Bearer ${c.env?.POCKETSIGN_TOKEN}`,
},
}
);
// ユーザーのブラウザセッションと紐づけて保存していた `nonce` と APIレスポンスの `metadata.nonce` を比較します。
// 一致しない場合、当該書面やそれに関連するデータは不正に作成された可能性があります。
if (getCookie(c, 'nonce') !== resp.metadata.nonce) {
return c.html(<Error message={'不正なリダイレクトを検知しました。'} />);
}
// APIレスポンスの `results` には、CreateSessionの `requests` で指定した要求に対する結果が含まれます。
const content = resp.results
.map(({ result }) => {
// 公的個人認証サービス(JPKI)より発行された署名用電子証明書による署名の結果を確認します。
if (result.case === 'digitalSignature') {
// 署名が正常に作成された場合
if (result.value.response.case === 'result') {
// 署名の検証結果がOKの場合
if (result.value.response.value.verification?.result === Verification_Result.OK) {
const content = result.value.response.value.certificateContent?.typeSpecificContent;
if (content?.case === 'jpkiCardDigitalSignatureContent') {
return `${content.value.commonName} 様、お申し込みありがとうございました。ご自宅(${content.value.address})に契約書をお送りします。`;
}
}
// 署名の検証に失敗した場合
else {
return `本人確認に失敗しました。理由:${
{
[Verification_Result.SIGNATURE_MISMATCH]: '署名が一致しませんでした',
[Verification_Result.CERTIFICATE_REVOKED]: '証明書が失効しています',
[Verification_Result.CERTIFICATE_EXPIRED]: '証明書が期限切れです',
[Verification_Result.UNSPECIFIED]: '不明なエラーが発生しました',
}[result.value.response.value.verification?.result ?? Verification_Result.UNSPECIFIED]
}。`;
}
}
// 署名が正常に作成されなかった場合
else {
return `お申し込みが確認できませんでした。理由:${result.value.response.value?.message}`;
}
}
})
.join('\n');
return c.html(<Callback content={content} />);
} catch (e) {
return c.html(<Error message={`エラーが発生しました\n\n${JSON.stringify(e, undefined, 2)}`} />);
}
});
注意
このセクションは現在作成中です。
このトピックについて知りたい場合は、お問い合わせください。