Đăng ký xác nhận thanh toán an toàn

Để sử dụng phương thức Xác nhận thanh toán bảo mật (SPC) trong một giao dịch, trước tiên, khách hàng phải đăng ký trình xác thực. Quy trình này rất giống với quy trình đăng ký WebAuthn, với việc có thêm tiện ích thanh toán.

Trong bài viết này, các ngân hàng phát hành với vai trò là bên đáng tin cậy (RP) có thể tìm hiểu cách triển khai quá trình đăng ký SPC. Trải nghiệm người dùng này sẽ được giải thích thêm trong bài viết 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 một tiện ích mở rộng cho tiêu chuẩn WebAuthn.

Kể từ tháng 4 năm 2022, SPC chỉ hỗ trợ Trình xác minh nền tảng xác minh người dùng (UVPA) trên máy tính. Tức là khách hàng cần phải sử dụng máy tính để bàn hoặc máy tính xách tay có trình xác thực được nhúng, chẳng hạn như:

  • Tính năng mở khoá (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ị

Hoạt động đăng ký thiết bị của bên phụ thuộc (RP) phải tuân theo một 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 quy trình xác thực mạnh mẽ để tài khoản không dễ bị xâm nhập. Hãy thận trọng: tình trạng thiếu bảo mật trong quá trình này cũng 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, giờ đây khách hàng có thể đăng ký thiết bị.

Quy trình đăng ký thông thường trên trang web của bên đáng tin cậy

Phát hiện tính năng

Trước khi yêu cầu khách hàng đăng ký thiết bị, RP phải kiểm tra để đảm bảo trình duyệt có 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ý một thiết bị cho SPC, hãy làm theo quy trình đăng ký WebAuthn với các yêu cầu sau:

  • Bắt buộc phải có trình xác thực nền tảng: authenticatorSelection.authenticatorAttachmentplatform.
  • Cần phải xác minh người dùng: authenticatorSelection.userVerificationrequired.
  • Bắt buộc phải có thông tin xác thực có thể phát hiện (khoá thường trú): authenticatorSelection.residentKeyrequired.

Ngoài ra, hãy chỉ định tiện ích "thanh toán" bằng isPayment: true. Việc chỉ định tiện ích này mà không đáp ứng các yêu cầu trên sẽ gửi một ngoại lệ

Một số lưu ý khác:

  • rp.id: tên máy chủ của RP. Phần eTLD+1 của miền phải khớp với nơi đăng ký. Bạn có thể dùng đối tượng này để xác thực trên các miền khớp với eTLD+1.
  • user.id: biểu thức nhị phân của giá trị nhận dạng người dùng. Giá trị nhận dạng này sẽ được trả về khi xác thực thành công nên RP phải cung cấp giá trị nhận dạng người dùng nhất quán của chủ thẻ.
  • excludeCredentials: một mảng thông tin xác thực để 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.

Ví dụ về mã đăng ký:

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 sẽ nhận được thông tin xác thực gửi tới máy chủ để xác minh.

Xác minh đăng ký

Trên máy chủ, RP phải xác minh thông tin xác thực và giữ lại khoá công khai để sử dụng sau này. Quy trình đăng ký phía máy chủ cũng giống như quy trình đăng ký WebAuthn thông thường. Bạn không cần làm gì thêm để tuân thủ SPC.

Đăng ký từ trong iframe

Nếu người thanh toán chưa đăng ký thiết bị với RP (công ty 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 giao dịch mua, RP có thể yêu cầu người thanh toán đăng ký thiết bị của họ một cách gián tiếp từ trong iframe.

Quy trình đăng ký trên trang web của người bán trong khi thanh toán.

Để làm như vậy, người bán hoặc nhà xuất bản mẹ phải cho phép rõ ràng hành động này trong iframe bằng cách sử dụng Chính sách về quyền. 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ý:

  1. 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 rằng thuộc tính allow chứa payment và nguồn gốc RP gọi ra hoạt động đăng ký WebAuthn.

  2. Tài liệu khung gốc (phân phát từ miền của người bán) được gửi cùng 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 thiết bị được đăng ký cho bên đáng tin cậy, khách hàng có thể xác nhận các khoản thanh toán trên trang web của người bán bằng tính năng Xác nhận thanh toán an toàn.