Untuk menggunakan Konfirmasi Pembayaran Aman (SPC) dalam transaksi, pelanggan harus mendaftarkan otentikator terlebih dahulu. Proses ini sangat mirip dengan WebAuthn proses pendaftaran, dengan tambahan ekstensi pembayaran.
Dalam artikel ini, bank penerbit yang bertindak sebagai pihak tepercaya (RP) dapat mempelajari untuk menerapkan pendaftaran SPC. Pengalaman pengguna dijelaskan lebih lanjut dalam ringkasan Konfirmasi Pembayaran Aman.
Bagaimana cara kerja pendaftaran Konfirmasi Pembayaran Aman?
SPC dibangun sebagai ekstensi untuk standar WebAuthn.
Mulai April 2022, SPC hanya mendukung Pengautentikasi Platform Verifikasi Pengguna (UVPA) di desktop. Artinya, pelanggan harus menggunakan desktop atau laptop dengan otentikator tersemat, seperti:
- Buka kunci fitur termasuk Touch ID di perangkat macOS
- Windows Hello di perangkat Windows
Daftarkan perangkat
Pendaftaran perangkat milik pihak tepercaya (RP) harus mengikuti proses verifikasi pengguna yang memadai. RP harus memastikan bahwa pelanggan telah masuk ke situs web menggunakan otentikasi yang kuat sehingga akun tidak mudah dibajak. Hati-hati: kurangnya keamanan dalam proses ini juga membahayakan SPC.
Setelah RP berhasil mengautentikasi pelanggan, pelanggan kini dapat daftarkan perangkat.
Deteksi fitur
Sebelum meminta pelanggan mendaftarkan perangkat, RP harus memeriksa apakah browser mendukung 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.
}
});
Mendaftarkan pengautentikasi
Untuk mendaftarkan perangkat ke SPC, ikuti proses pendaftaran WebAuthn dengan langkah berikut persyaratan:
- Otentikator platform diperlukan:
authenticatorSelection.authenticatorAttachment
adalahplatform
. - Verifikasi pengguna diperlukan:
authenticatorSelection.userVerification
adalahrequired
. - Kredensial yang dapat ditemukan (kunci yang tersimpan) diperlukan:
authenticatorSelection.residentKey
adalahrequired
.
Selain itu, tentukan "pembayaran" ekstensi dengan isPayment: true
. Menentukan
ekstensi ini tanpa memenuhi persyaratan di atas akan menampilkan pengecualian
Beberapa peringatan lainnya:
rp.id
: nama host RP. eTLD+1 sebagai bagian dari domain harus sama dengan tempat domain tersebut didaftarkan. Dapat digunakan untuk autentikasi pada domain yang cocok dengan eTLD+1.user.id
: ekspresi biner ID pengguna. ID yang sama akan dikembalikan pada saat otentikasi berhasil sehingga RP harus memberikan sebuah ID pengguna pemegang kartu yang konsisten.excludeCredentials
: array kredensial sehingga RP dapat menghindari mendaftarkan otentikator yang sama.
Untuk informasi selengkapnya tentang proses pendaftaran WebAuthn, lihat webauthn.guide.
Contoh kode pendaftaran:
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.
}
Setelah pendaftaran berhasil, RP menerima kredensial untuk dikirim ke server untuk verifikasi.
Memverifikasi pendaftaran
Di server, RP harus memverifikasi kredensial dan menyimpan kunci publik untuk digunakan nanti. Proses pendaftaran sisi server sama dengan pendaftaran WebAuthn biasa. Tidak akan terjadi apa-apa tambahan diperlukan untuk mematuhi SPC.
Pendaftaran dari dalam iframe
Jika pembayar belum mendaftarkan perangkatnya di RP (penerbit pembayaran), pembayar dapat mendaftar di situs penjual. Setelah autentikasi berhasil saat pembelian, RP dapat meminta pembayar mendaftarkan perangkatnya secara tidak langsung, dari dalam iframe.
Untuk melakukannya, penjual atau induk harus secara eksplisit mengizinkan tindakan ini dalam iframe menggunakan Kebijakan Izin. Penerbit mengikuti langkah yang sama untuk mendaftarkan pengautentikasi dalam iframe.
Ada dua pendekatan yang dapat digunakan penjual untuk mengizinkan pendaftaran:
Tag iframe dalam HTML yang ditayangkan dari domain penjual menambahkan atribut
allow
:<iframe name="iframe" allow="payment https://spc-rp.glitch.me"></iframe>
Pastikan atribut
allow
berisipayment
dan asal RP yang memanggil pendaftaran WebAuthn.Dokumen frame induk (yang disalurkan dari domain penjual) dikirim dengan header HTTP
Permissions-Policy
:Permissions-Policy: payment=(self "https://spc-rp.glitch.me")
Langkah berikutnya
Setelah perangkat didaftarkan ke pihak tepercaya, pelanggan dapat mengonfirmasi pembayaran di situs penjual menggunakan Konfirmasi Pembayaran Aman.
- Pelajari cara melakukan autentikasi dengan Konfirmasi Pembayaran Aman
- Baca ringkasan Konfirmasi Pembayaran Aman