Mendaftarkan Konfirmasi Pembayaran Aman

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.

Alur kerja pendaftaran standar di situs pihak tepercaya

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 adalah platform.
  • Verifikasi pengguna diperlukan: authenticatorSelection.userVerification adalah required.
  • Kredensial yang dapat ditemukan (kunci yang tersimpan) diperlukan: authenticatorSelection.residentKey adalah required.

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.

Alur kerja pendaftaran di situs penjual selama pembayaran.

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:

  1. 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 berisi payment dan asal RP yang memanggil pendaftaran WebAuthn.

  2. 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.