Güvenli Ödeme Onayı Kaydet

Bir işlemde Güvenli Ödeme Onayı'nı (SPC) kullanmak için müşterinin önce bir kimlik doğrulayıcıyı kaydetmesi gerekir. Bu işlem, WebAuthn kayıt işlemine çok benzer ve buna ek olarak bir ödeme uzantısı da sunulur.

Bu makalede, bağlı taraf (RP) olarak görev yapan kredi veren bankalar, SPC kaydının nasıl uygulanacağını öğrenebilir. Kullanıcı deneyimi, Güvenli Ödeme Onayı'na genel bakış bölümünde daha ayrıntılı bir şekilde açıklanmaktadır.

Güvenli Ödeme Onayı kaydı nasıl yapılır?

SPC, WebAuthn standardının bir uzantısı olarak geliştirilmiştir.

Nisan 2022'den itibaren SPC, masaüstü cihazlarda yalnızca Kullanıcı Doğrulama Platformu Kimlik Doğrulayıcılarını (UVPA) desteklemektedir. Bu, müşterinin aşağıdakiler gibi yerleşik bir kimlik doğrulayıcıya sahip masaüstü veya dizüstü bilgisayarında olması gerektiği anlamına gelir:

  • macOS cihazlarda Touch ID de dahil olmak üzere kilit açma özelliği
  • Windows cihazda Windows Hello

Cihazı kaydettirin

Bağlı tarafın (RP) cihazı kaydı, yeterince güçlü bir kullanıcı doğrulama süreci uygulamalıdır. RP, hesabın kolayca ele geçirilmemesi için müşterinin güçlü bir kimlik doğrulama yöntemi kullanarak web sitesinde oturum açtığından emin olmalıdır. Dikkatli olun: Bu süreçte güvenlik eksikliği SPC'yi de riske atar.

RP, müşterinin kimliğini başarıyla doğruladıktan sonra müşteri artık bir cihaz kaydedebilir.

Bağlı tarafın web sitesindeki tipik kayıt iş akışı

Özellik algılama

RP, müşteriden cihazı kaydetmesini istemeden önce tarayıcının SPC'yi destekleyip desteklemediğini kontrol etmelidir.

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

Kimlik doğrulayıcı kaydedin

Bir cihazı SPC'ye kaydettirmek için aşağıdaki gereksinimleri içeren WebAuthn kayıt sürecini uygulayın:

  • Platform kimlik doğrulayıcısı gerekli: authenticatorSelection.authenticatorAttachment, platform.
  • Kullanıcı doğrulaması gerekli: authenticatorSelection.userVerification, required.
  • Bulunabilir kimlik bilgileri (yerleşik anahtarlar) gerekli: authenticatorSelection.residentKey değeri: required.

Ayrıca, isPayment: true ile bir "ödeme" uzantısı belirtin. Yukarıdaki gereksinimleri karşılamadan bu uzantının belirtilmesinde bir istisna oluşur

Dikkat edilmesi gereken diğer noktalar:

  • rp.id: RP'nin ana makine adı. Alanın eTLD+1 kısmı, kaydedildiği yerle eşleşmelidir. eTLD+1 ile eşleşen alan adlarında kimlik doğrulama için kullanılabilir.
  • user.id: Kullanıcı tanımlayıcısının ikili ifadesi. Başarılı kimlik doğrulamada aynı tanımlayıcı döndürüleceği için RP, kart sahibine ait tutarlı bir kullanıcı tanımlayıcısı sağlamalıdır.
  • excludeCredentials: RP'nin aynı kimlik doğrulayıcıyı kaydetmekten kaçınabilmesi için bir kimlik bilgisi dizisidir.

WebAuthn kayıt işlemiyle ilgili daha fazla bilgi için webauthn.guide sayfasına bakın.

Örnek kayıt kodu:

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, kayıt başarılı olduktan sonra doğrulama için sunucuya gönderilecek bir kimlik bilgisi alır.

Kaydı doğrulayın

Sunucuda, RP'nin kimlik bilgilerini doğrulaması ve ortak anahtarı daha sonra kullanılmak üzere saklaması gerekir. Sunucu tarafı kayıt işlemi normal WebAuthn kaydıyla aynıdır. SPC'ye uymak için başka hiçbir şey gerekmez.

Bir iframe içinden kayıt

Ödeyen, cihazını RP'ye (ödeme veren kuruluş) kaydetmediyse satıcı web sitesine kaydolabilir. Satın alma sırasında başarılı bir kimlik doğrulama işleminden sonra RP, ödeyen kullanıcıdan cihazını bir iframe içinden dolaylı olarak kaydetmesini isteyebilir.

Ödeme sırasında satıcı web sitesinde kayıt iş akışı.

Bunu yapmak için satıcı veya ana yayıncı, İzin Politikası'nı kullanarak bir iframe içinde bu işleme açıkça izin vermelidir. Yayıncı, iframe'de bir kimlik doğrulayıcıyı kaydetmek için aynı adımları uygular.

Satıcı, kayıt işlemine izin vermek için iki yaklaşım izleyebilir:

  1. Satıcı alanından yayınlanan HTML'deki iframe etiketi bir allow özelliği ekler:

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

    allow özelliğinin payment ve WebAuthn kaydını çağıran RP kaynağını içerdiğinden emin olun.

  2. Üst çerçeve dokümanı (satıcı alanından sunulan), Permissions-Policy HTTP üst bilgisi ile gönderilir:

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

Sonraki adımlar

Cihaz, bağlı tarafa kaydedildikten sonra müşteri, Güvenli Ödeme Onayı'nı kullanarak ödemeleri satıcının web sitesinde onaylayabilir.