如要在交易中使用安全付款確認 (SPC),客戶必須 請先註冊驗證器這項程序與 WebAuthn 非常類似 並添加付款額外資訊。
身為信賴方 (RP) 的發卡銀行可透過本文瞭解 實作 SPC 註冊。如要進一步瞭解使用者體驗,請參閱 安全付款確認總覽。
安全付款確認註冊如何運作?
SPC 是 WebAuthn 標準的擴充功能。
自 2022 年 4 月起,SPC 僅支援使用者驗證平台 Authenticator (UVPA)。也就是說,客戶必須使用電腦或筆電 並嵌入驗證器,例如:
- macOS 裝置上的 Touch ID 等解鎖功能
- Windows 裝置上的 Windows Hello
註冊裝置
依賴方 (RP) 裝置註冊時,必須遵循 確保使用者驗證程序安全無虞受限方必須確保 客戶已透過強式驗證機制登入該網站, 帳戶不容易遭盜用。請注意:此程序缺乏安全性 讓 SPC 面臨風險
RP 成功驗證客戶後,客戶現在可以 註冊裝置。
特徵偵測
要求客戶註冊裝置之前,受限方必須先確認 瀏覽器支援 SPC。
const isSecurePaymentConfirmationSupported = async () => {
if (!'PaymentRequest' in window) {
return [false, 'Payment Request API is not supported'];
}
try {
// The data below is the minimum required to create the request and
// check if a payment can be made.
const supportedInstruments = [
{
supportedMethods: "secure-payment-confirmation",
data: {
// RP's hostname as its ID
rpId: 'rp.example',
// A dummy credential ID
credentialIds: [new Uint8Array(1)],
// A dummy challenge
challenge: new Uint8Array(1),
instrument: {
// Non-empty display name string
displayName: ' ',
// Transparent-black pixel.
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==',
},
// A dummy merchant origin
payeeOrigin: 'https://non-existent.example',
}
}
];
const details = {
// Dummy shopping details
total: {label: 'Total', amount: {currency: 'USD', value: '0'}},
};
const request = new PaymentRequest(supportedInstruments, details);
const canMakePayment = await request.canMakePayment();
return [canMakePayment, canMakePayment ? '' : 'SPC is not available'];
} catch (error) {
console.error(error);
return [false, error.message];
}
};
isSecurePaymentConfirmationSupported().then(result => {
const [isSecurePaymentConfirmationSupported, reason] = result;
if (isSecurePaymentConfirmationSupported) {
// Display the payment button that invokes SPC.
} else {
// Fallback to the legacy authentication method.
}
});
註冊驗證器
如要為 SPC 註冊裝置,請按照以下 WebAuthn 註冊程序進行 規定:
- 需要平台驗證器:
authenticatorSelection.authenticatorAttachment
為platform
。 - 需要驗證使用者:
authenticatorSelection.userVerification
為required
。 - 需要可供探索的憑證 (常駐金鑰):
authenticatorSelection.residentKey
為required
。
此外,請指定「付款」副檔名為 isPayment: true
。指定
這項擴充功能不符合上述規定時,就會擲回例外狀況
其他注意事項:
rp.id
:RP 的主機名稱。 eTLD+1 部分 ( 網域必須與註冊的位置相符。這類模型可用於 符合 eTLD+1 的網域驗證。user.id
:使用者 ID 的二進位運算式。相同的 ID 會在成功驗證時傳回 ,因此 RP 必須提供 持卡人使用一致的使用者 IDexcludeCredentials
:讓 RP 避開的憑證陣列 註冊同一個驗證器。
如要進一步瞭解 WebAuthn 的註冊程序,請參閱 webauthn.guide.
註冊代碼範例:
const options = {
challenge: new Uint8Array([21...]),
rp: {
id: "rp.example",
name: "Fancy Bank",
},
user: {
id: new Uint8Array([21...]),
name: "jane.doe@example.com",
displayName: "Jane Doe",
},
excludeCredentials: [{
id: new Uint8Array([21...]),
type: 'public-key',
transports: ['internal'],
}, ...],
pubKeyCredParams: [{
type: "public-key",
alg: -7 // "ES256"
}, {
type: "public-key",
alg: -257 // "RS256"
}],
authenticatorSelection: {
userVerification: "required",
residentKey: "required",
authenticatorAttachment: "platform",
},
timeout: 360000, // 6 minutes
// Indicate that this is an SPC credential. This is currently required to
// allow credential creation in an iframe, and so that the browser knows this
// credential relates to SPC.
extensions: {
"payment": {
isPayment: true,
}
}
};
try {
const credential = await navigator.credentials.create({ publicKey: options });
// Send new credential info to server for verification and registration.
} catch (e) {
// No acceptable authenticator or user refused consent. Handle appropriately.
}
註冊成功後,RP 就會收到要傳送至伺服器進行驗證的憑證。
驗證註冊
在伺服器上,RP 必須驗證憑證並保留 以便稍後使用伺服器端的註冊程序與一般 WebAuthn 的註冊流程相同。無 遵守《SPC》的相關規定。
從 iframe 內註冊
如果付款人尚未向 RP (付款發卡機構) 註冊裝置, 付款人可在商家網站上註冊。驗證成功後 買家可以在購買過程中要求付款人註冊裝置 產生互動
而要這麼做的話,商家或上層必須在 使用權限政策的 iframe。 發卡機構的相同步驟在 iframe 中註冊驗證器。
商家可以透過以下兩種方法允許註冊:
在從商家網域提供的 HTML 中,iframe 標記會新增
allow
屬性:<iframe name="iframe" allow="payment https://spc-rp.glitch.me"></iframe>
請確認
allow
屬性包含payment
和叫用 WebAuthn 註冊的 RP 來源。上層頁框文件 (從商家網域提供) 會以
Permissions-Policy
HTTP 標頭傳送:Permissions-Policy: payment=(self "https://spc-rp.glitch.me")
後續步驟
裝置向信賴方註冊之後,客戶就能透過「安全付款確認」在商家網站上確認付款。
- 瞭解如何透過安全付款確認程序進行驗證
- 閱讀安全付款確認總覽