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

申込情報の検証

このページでは、PocketSign Stamp を利用して、利用者が申込情報に対して行った署名の検証を要求し、検証結果を確認する方法を説明します。

シーケンス

  1. 利用者は、事業者バックエンドへ署名が完了したことを通知します。
  2. 事業者バックエンドは、Stamp API へ署名の検証を要求します。
  3. Stamp API は、PocketSign Verify API により署名の検証を行います。
  4. Stamp API は、署名の検証結果を事業者バックエンドへ返却します。
  5. 事業者バックエンドは、申込等の結果を利用者に通知します。

実装例

ここでは、事業者バックエンド側から Stamp API へ署名の検証を要求し、その結果を確認する実装例を示します。

こちらの実装例で利用している API については、セッションの終了をご参照ください。

// 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)}`} />);
}
});