Güvenli Ödeme Onayı ile kimliğinizi doğrulayın

Satıcılar, belirli bir kredi kartı veya banka hesabı için güçlü müşteri kimlik doğrulama (SCA) sürecinin bir parçası olarak Güvenli Ödeme Onayı'nı (SPC) kullanabilir. WebAuthn, kimlik doğrulamayı (genellikle biyometri aracılığıyla) gerçekleştirir. WebAuthn önceden kaydedilmelidir. Bu konuda bilgi edinmek için Güvenli Ödeme Onayı Kaydetme başlıklı makaleyi inceleyebilirsiniz.

Tipik bir uygulamanın işleyiş şekli

SPC için en yaygın kullanım, müşterinin satıcının kendisinden (kredi kartını veren kuruluş veya banka, ödeyen kimlik doğrulamasını zorunlu kılabilir).

Kimlik doğrulama iş akışı.

Kimlik doğrulama akışını adım adım inceleyelim:

  1. Müşteri, ödeme kimlik bilgilerini (ör. kredi kartı) sağladığında bilgileri) satıcıya iletmek.
  2. Satıcı, ödeme yapan kullanıcının ayrı bir kimlik doğrulamasına ihtiyacı olup olmadığını ödeme kimlik bilgisinin ilgili veren kuruluşundan veya bankasından (güvenilir taraf veya GT) sorar. Bu değişim, örneğin EMV® 3-D Secure ile gerçekleşebilir.
    • Kısıtlanmış taraf, satıcının SPC kullanmasını isterse ve kullanıcı daha önce giriş yaptığında, RP tarafından kaydedilen kimlik bilgisi kimliklerinin listesiyle ödeme yapan taraf ve bir zorluk.
    • Kimlik doğrulama gerekmiyorsa satıcı işlemi tamamlamaya devam edebilir.
  3. Kimlik doğrulama gerekiyorsa satıcı tarayıcının SPC'yi destekleyip desteklemediğini belirler.
    • Tarayıcı SPC'yi desteklemiyorsa mevcut kimlik doğrulama akışına devam edin.
  4. Satıcı, SPC'yi çağırır. Tarayıcı bir onay iletişim kutusu görüntüler.
    • RP'den kimlik bilgisi kimliği iletilmiyorsa mevcut kimlik doğrulama akışına geri dönün. Başarılı bir kimlik doğrulamasından sonra SPC kaydını kullanmayı düşünün kullanabilirsiniz.
  5. Kullanıcı, cihazın kilidini açarak ödeme yapabilirsiniz.
  6. Satıcı, kimlik doğrulamadan bir kimlik bilgisi alır.
  7. RP, kimlik bilgisini satıcıdan alır ve kimliğin gerçekliğini doğrular.
  8. RP, doğrulama sonuçlarını satıcıya gönderir.
  9. Satıcı, kullanıcıya ödemenin yapılıp yapılmadığını belirten bir mesaj gösterir. başarılı olup olmadığını gösterir.

Özellik algılama

Tarayıcıda SPC'nin desteklenip desteklenmediğini tespit etmek için şu adrese sahte bir çağrı gönderebilirsiniz: canMakePayment().

Satıcının web sitesinde SPC'yi algılama özelliğini kullanmak için aşağıdaki kodu kopyalayıp yapıştırın.

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

Kullanıcının kimliğini doğrulama

Kullanıcının kimliğini doğrulamak için PaymentRequest.show() yöntemini şununla çağırın: secure-payment-confirmation ve WebAuthn parametreleri:

Ödeme yönteminin data mülküne SecurePaymentConfirmationRequest sağlamanız gereken parametreler aşağıda verilmiştir.

Parametre Açıklama
rpId Kısıtlanmış taraf kimliği olarak RP kaynağının ana makine adı.
challenge Tekrar saldırılarını önleyen rastgele bir meydan okuma.
credentialIds Kimlik bilgisi kimlikleri dizisi. WebAuthn'un kimlik doğrulamasında allowCredentials mülkü bir PublicKeyCredentialDescriptor nesnesi dizisi kabul eder ancak SPC'de yalnızca kimlik bilgisi kimliklerinin bir listesini iletirsiniz.
payeeName (isteğe bağlı) Alacaklı adı.
payeeOrigin Alıcının kaynağı. Yukarıda belirtilen senaryoda, satıcının kaynağıdır.
instrument displayName için bir dize ve icon için bir resim kaynağına işaret eden URL. İsteğin başarılı olması için iconMustBeShown için isteğe bağlı bir boole değeri (true olarak varsayılan) belirtilmelidir. Bu değer, bir simgenin başarıyla getirilip gösterilmesi gerektiğini belirtir.
timeout İşlemi imzalamak için zaman aşımı (milisaniye cinsinden)
extensions WebAuthn çağrısına uzantılar eklendi. "Ödeme"yi belirtmeniz gerekmez uzatın.

Şu örnek kodu inceleyin:

// After confirming SPC is available on this browser via a feature detection,
// fetch the request options cross-origin from the RP server.
const options = fetchFromServer('https://rp.example/spc-auth-request');
const { credentialIds, challenge } = options;

const request = new PaymentRequest([{
  // Specify `secure-payment-confirmation` as payment method.
  supportedMethods: "secure-payment-confirmation",
  data: {
    // The RP ID
    rpId: 'rp.example',

    // List of credential IDs obtained from the RP server.
    credentialIds,

    // The challenge is also obtained from the RP server.
    challenge,

    // A display name and an icon that represent the payment instrument.
    instrument: {
      displayName: "Fancy Card ****1234",
      icon: "https://rp.example/card-art.png",
      iconMustBeShown: false
    },

    // The origin of the payee (merchant)
    payeeOrigin: "https://merchant.example",

    // The number of milliseconds to timeout.
    timeout: 360000,  // 6 minutes
  }
}], {
  // Payment details.
  total: {
    label: "Total",
    amount: {
      currency: "USD",
      value: "5.00",
    },
  },
});

try {
  const response = await request.show();

  // response.details is a PublicKeyCredential, with a clientDataJSON that
  // contains the transaction data for verification by the issuing bank.
  // Make sure to serialize the binary part of the credential before
  // transferring to the server.
  const result = fetchFromServer('https://rp.example/spc-auth-response', response.details);
  if (result.success) {
    await response.complete('success');
  } else {
    await response.complete('fail');
  }
} catch (err) {
  // SPC cannot be used; merchant should fallback to traditional flows
  console.error(err);
}

.show() işlevi, PaymentResponse details dışında bir nesne, İşlem verilerini içeren clientDataJSON (payment) tarafından doğrulanması gerekir.

Oluşturulan kimlik bilgisi, kaynaklar arası RP'ye aktarılmalıdır ve doğrulandı.

RP'nin işlemi doğrulama şekli

RP sunucusunda işlem verilerini doğrulamak, ödeme sürecindeki en önemli adımdır.

RP, işlem verilerini doğrulamak için WebAuthn'ın kimlik doğrulama beyanı doğrulama sürecini uygulayabilir. Ayrıca, payment doğrulamasını da yapması gerekir.

clientDataJSON için örnek bir yükü:

{
  "type":"payment.get",
  "challenge":"SAxYy64IvwWpoqpr8JV1CVLHDNLKXlxbtPv4Xg3cnoc",
  "origin":"https://spc-merchant.glitch.me",
  "crossOrigin":false,
  "payment":{
    "rp":"spc-rp.glitch.me",
    "topOrigin":"https://spc-merchant.glitch.me",
    "payeeOrigin":"https://spc-merchant.glitch.me",
    "total":{
      "value":"15.00",
      "currency":"USD"
    },
    "instrument":{
      "icon":"https://cdn.glitch.me/94838ffe-241b-4a67-a9e0-290bfe34c351%2Fbank.png?v=1639111444422",
      "displayName":"Fancy Card 825809751248"
    }
  }
}
  • rp, RP'nin kaynağıyla eşleşir.
  • topOrigin, kısıtlanmış tarafın beklediği üst düzey kaynakla ( satıcının kökeni kabul edilir.
  • payeeOrigin, kullanıcıya gösterilmesi gereken alacaklının kaynağıyla eşleşiyor.
  • total, kullanıcıya gösterilmesi gereken işlem tutarıyla eşleşir.
  • instrument, olması gereken ödeme aracı bilgileriyle eşleşmelidir. kullanıcıya gösterilmişti.
const clientData = base64url.decode(response.clientDataJSON);
const clientDataJSON = JSON.parse(clientData);

if (!clientDataJSON.payment) {
  throw 'The credential does not contain payment payload.';
}

const payment = clientDataJSON.payment;
if (payment.rp !== expectedRPID ||
    payment.topOrigin !== expectedOrigin ||
    payment.payeeOrigin !== expectedOrigin ||
    payment.total.value !== '15.00' ||
    payment.total.currency !== 'USD') {
  throw 'Malformed payment information.';
}

Tüm doğrulama ölçütleri karşılandıktan sonra RP, Satıcıya işlemin başarılı olduğunu bildirir.

Sonraki adımlar