如要在交易中使用安全付款確認 (SPC),客戶必須先註冊驗證器。這項程序與 WebAuthn 註冊程序非常相似,只是多了付款擴充功能。
本文將說明發卡銀行如何以信賴方 (RP) 身分實作 SPC 註冊。如要進一步瞭解使用者體驗,請參閱安全付款確認總覽。
安全付款確認註冊程序如何運作?
SPC 是 WebAuthn 標準的擴充功能。
自 2022 年 4 月起,SPC 僅支援電腦版的使用者驗證平台驗證工具 (UVPA)。也就是說,客戶必須使用內嵌驗證器的電腦或筆記型電腦,例如:
- 在 macOS 裝置上使用 Touch ID 解鎖
- Windows 裝置上的 Windows Hello
註冊裝置
依賴方 (RP) 註冊裝置時,應遵循足夠嚴格的使用者驗證程序。RP 必須確認客戶已透過強式驗證機制登入網站,才能避免帳戶遭到盜用。請注意:如果這個程序缺乏安全性,也會使 SPC 面臨風險。
RP 成功驗證客戶後,客戶就能註冊裝置。
特徵偵測
在要求客戶註冊裝置之前,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 應提供持卡人的一致使用者 ID。excludeCredentials
:憑證陣列,讓 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 (付款機構) 註冊裝置,可以前往商家網站註冊。在購買過程中成功驗證後,RP 可透過 iframe 間接要求付款者註冊裝置。
為此,商家或家長必須使用權限政策,明確允許在 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")
後續步驟
裝置註冊至依賴方後,客戶就能在商家網站上使用安全付款確認功能確認付款。
- 瞭解如何透過安全付款確認驗證
- 閱讀安全付款確認功能總覽