Đă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 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ị.

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ị, 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.authenticatorAttachmentplatform.
  • Yêu cầu xác minh người dùng: authenticatorSelection.userVerificationrequired.
  • Thông tin xác thực tìm được (khoá thường trú) là thông tin bắt buộc: authenticatorSelection.residentKeyrequired.

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.

Quy trình đăng ký trên trang web của người bán trong quy trình 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 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ý:

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

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