Зарегистрируйте безопасное подтверждение платежа

Чтобы использовать безопасное подтверждение платежа (SPC) в транзакции, клиент должен сначала зарегистрировать аутентификатор. Этот процесс очень похож на процесс регистрации WebAuthn, но с добавлением расширения платежа.

В этой статье банки-эмитенты, выступающие в качестве проверяющих сторон (RP), могут узнать, как реализовать регистрацию SPC. Пользовательский опыт подробно описан в обзоре безопасного подтверждения платежа .

Как работает регистрация безопасного подтверждения платежа?

SPC создан как расширение стандарта WebAuthn.

По состоянию на апрель 2022 года SPC поддерживает только аутентификаторы платформы проверки пользователей (UVPA) на настольных компьютерах. Это означает, что клиент должен использовать настольный компьютер или ноутбук со встроенным аутентификатором, например:

  • Функция разблокировки, включая Touch ID, на устройстве MacOS
  • Windows Hello на устройстве Windows

Зарегистрируйте устройство

Регистрация устройства проверяющей стороной (RP) должна сопровождаться достаточно строгим процессом проверки пользователя. RP должен убедиться, что клиент вошел на веб-сайт с использованием строгой аутентификации, чтобы его учетную запись нельзя было легко взломать. Будьте осторожны: отсутствие безопасности в этом процессе также подвергает риску SPC.

После того как RP успешно аутентифицировал клиента, клиент теперь может зарегистрировать устройство.

Типичный процесс регистрации на веб-сайте проверяющей стороны

Обнаружение функций

Прежде чем просить клиента зарегистрировать устройство, RP должен проверить, поддерживает ли браузер 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.
  }
});

Зарегистрируйте аутентификатор

Чтобы зарегистрировать устройство для SPC, выполните процесс регистрации WebAuthn со следующими требованиями:

  • Требуется аутентификатор платформы: authenticatorSelection.authenticatorAttachmentplatform .
  • required authenticatorSelection.userVerification
  • required обнаруживаемые учетные данные (резидентные ключи): authenticatorSelection.residentKey .

Кроме того, укажите расширение «платеж» с помощью isPayment: true . Указание этого расширения без соблюдения вышеуказанных требований приведет к возникновению исключения.

Некоторые другие предостережения:

  • rp.id : имя хоста RP. Часть домена eTLD+1 должна совпадать с местом регистрации. Его можно использовать для аутентификации в доменах, соответствующих eTLD+1.
  • user.id : двоичное выражение идентификатора пользователя. Тот же идентификатор будет возвращен при успешной аутентификации, поэтому RP должен предоставить согласованный идентификатор пользователя держателя карты.
  • excludeCredentials : массив учетных данных, чтобы RP мог избежать регистрации одного и того же аутентификатора.

Дополнительную информацию о процессе регистрации WebAuthn см. на сайте webauthn.guide .

Пример регистрационного кода:

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

После успешной регистрации RP получает учетные данные для отправки на сервер для проверки.

Подтвердить регистрацию

На сервере RP должен проверить учетные данные и сохранить открытый ключ для дальнейшего использования. Процесс регистрации на стороне сервера аналогичен обычной регистрации WebAuthn . Для соответствия SPC не требуется ничего дополнительного.

Регистрация из iframe

Если плательщик не зарегистрировал свое устройство у RP (эмитента платежа), плательщик может зарегистрироваться на веб-сайте продавца. После успешной аутентификации во время покупки RP может попросить плательщика зарегистрировать свое устройство косвенно, из iframe.

Порядок регистрации на сайте мерчанта во время оплаты.

Для этого продавец или родительская компания должны явно разрешить это действие в iframe, используя Политику разрешений . Эмитент выполняет те же шаги для регистрации аутентификатора в iframe.

Продавец может разрешить регистрацию двумя способами:

  1. Тег iframe в HTML-коде, передаваемом из домена продавца, добавляет атрибут allow :

    <iframe name="iframe" allow="payment https://spc-rp.glitch.me"></iframe>
    

    Убедитесь, что атрибут allow содержит payment и источник RP, который вызывает регистрацию WebAuthn.

  2. Документ родительского фрейма (подаваемый из домена продавца) отправляется с HTTP-заголовком Permissions-Policy :

    Permissions-Policy: payment=(self "https://spc-rp.glitch.me")
    

Следующие шаги

После того как устройство зарегистрировано у проверяющей стороны, клиент может подтверждать платежи на веб-сайте продавца с помощью безопасного подтверждения платежа.