Để sử dụng phương thức Xác nhận thanh toán an toàn (SPC) trong một giao dịch, khách hàng phải trước tiên, hãy đăng ký trình xác thực. Quá trình này rất giống với WebAuthn quá trình đăng ký, có thêm thời gian gia hạn thanh toán.
Trong bài viết này, các ngân hàng phát hành đóng vai trò là bên đáng tin cậy (RP) có thể tìm hiểu cách để triển khai đăng ký SPC. Trải nghiệm người dùng sẽ được giải thích thêm trong tổng quan về Xác nhận thanh toán an toàn.
Quy trình đăng ký Xác nhận thanh toán an toàn hoạt động như thế nào?
SPC được xây dựng dưới dạng phần mở rộng của tiêu chuẩn WebAuthn.
Kể từ tháng 4 năm 2022, SPC chỉ hỗ trợ Trình xác thực nền tảng xác minh người dùng (UVPA) trên máy tính. Điều này có nghĩa là khách hàng cần sử dụng máy tính để bàn hoặc máy tính xách tay bằng trình xác thực được nhúng như:
- Mở khoá tính năng, bao gồm cả Touch ID trên thiết bị macOS
- Windows Hello trên thiết bị Windows
Đăng ký thiết bị
Việc đăng ký thiết bị (RP) của bên phụ thuộc phải tuân theo quy trình xác minh người dùng đủ mạnh. RP phải đảm bảo rằng khách hàng đã đăng nhập vào trang web bằng xác thực mạnh mẽ để tài khoản không dễ bị xâm nhập. Thận trọng: quá trình này thiếu bảo mật cũng sẽ khiến SPC gặp rủi ro.
Sau khi bên bị hạn chế đã xác thực thành công khách hàng, bây giờ đăng ký một thiết bị.
Phát hiện tính năng
Trước khi yêu cầu khách hàng đăng ký thiết bị, bên bị hạn chế phải kiểm tra để đảm bảo trình duyệt hỗ trợ 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.
}
});
Đăng ký trình xác thực
Để đăng ký thiết bị cho SPC, hãy làm theo quy trình đăng ký WebAuthn với các yêu cầu:
- Cần có trình xác thực nền tảng:
authenticatorSelection.authenticatorAttachment
làplatform
. - Yêu cầu xác minh người dùng:
authenticatorSelection.userVerification
làrequired
. - Thông tin xác thực tìm được (khoá thường trú) là thông tin bắt buộc:
authenticatorSelection.residentKey
làrequired
.
Ngoài ra, hãy chỉ định "thanh toán" tiện ích với isPayment: true
. Chỉ định
tiện ích này không đáp ứng các yêu cầu ở trên sẽ gửi một ngoại lệ
Một số điều khác cần lưu ý:
rp.id
: tên máy chủ của RP. Phần eTLD+1 của phải khớp với nơi được đăng ký. Có thể dùng cho xác thực trên các miền khớp với eTLD+1.user.id
: một biểu thức nhị phân của giá trị nhận dạng người dùng. Cùng một mã nhận dạng sẽ được trả về khi xác thực thành công để RP phải cung cấp mã nhận dạng người dùng nhất quán của chủ thẻ.excludeCredentials
: một mảng thông tin đăng nhập để RP có thể tránh đăng ký cùng một trình xác thực.
Để biết thêm thông tin về quy trình đăng ký WebAuthn, hãy tham khảo webauthn.guide.
Mã đăng ký mẫu:
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.
}
Sau khi đăng ký thành công, RP nhận được thông tin xác thực để gửi đến máy chủ nhằm xác minh.
Xác minh thông tin đăng ký
Trên máy chủ, RP phải xác minh thông tin xác thực và lưu giữ khoá công khai cho để sử dụng sau này. Quy trình đăng ký phía máy chủ giống như quy trình đăng ký WebAuthn thông thường. Không tùy chọn nào là yêu cầu bắt buộc để tuân thủ SPC.
Lượt đăng ký từ bên trong iframe
Nếu người thanh toán chưa đăng ký thiết bị của họ với RP (nhà phát hành thanh toán), thì người thanh toán có thể đăng ký trên trang web của người bán. Sau khi xác thực thành công trong khi mua hàng, bên thanh toán có thể yêu cầu người thanh toán đăng ký thiết bị của họ gián tiếp từ trong iframe.
Để làm như vậy, người bán hoặc nhà xuất bản mẹ phải cho phép hành động này một cách rõ ràng trong một iframe bằng cách sử dụng Chính sách quyền. Trình phát hành làm theo các bước tương tự để đăng ký trình xác thực trong iframe.
Có hai cách để người bán cho phép đăng ký:
Thẻ iframe trong HTML được phân phát từ miền của người bán sẽ thêm thuộc tính
allow
:<iframe name="iframe" allow="payment https://spc-rp.glitch.me"></iframe>
Đảm bảo thuộc tính
allow
chứapayment
và nguồn gốc RP gọi ra quy trình đăng ký WebAuthn.Tài liệu khung gốc (được phân phát từ miền của người bán) được gửi với tiêu đề HTTP
Permissions-Policy
:Permissions-Policy: payment=(self "https://spc-rp.glitch.me")
Các bước tiếp theo
Sau khi đăng ký thiết bị với bên đáng tin cậy, khách hàng có thể xác nhận thanh toán trên trang web của người bán bằng phương thức Xác nhận thanh toán an toàn.
- Tìm hiểu cách xác thực bằng một Xác nhận thanh toán an toàn
- Đọc tổng quan về Xác nhận thanh toán an toàn