تسجيل تأكيد الدفع الآمن

لاستخدام ميزة "تأكيد الدفع الآمن" (SPC) في معاملة، على العميل عليكم تسجيل برنامج مصادقة أولاً. تتشابه هذه العملية إلى حد كبير مع WebAuthn عملية التسجيل، مع إضافة تمديد الدفع.

تتناول هذه المقالة المصارف التي تُصدرها والتي تعمل كأطراف معتمِدة (RP) لمعرفة كيف لتنفيذ تسجيل SPC. يتم توضيح تجربة المستخدم بمزيد من التفصيل في نظرة عامة حول تأكيد الدفع الآمن

كيف يعمل التسجيل في خدمة تأكيد الدفع الآمن؟

تم إنشاء أداة SPC كامتداد لمعيار WebAuthn.

اعتبارًا من نيسان (أبريل) 2022، ستوفّر SPC فقط أدوات مصادقة على منصات التحقق من المستخدمين. (UVPA) على أجهزة الكمبيوتر المكتبية. هذا يعني أن العميل يحتاج إلى استخدام كمبيوتر مكتبي أو كمبيوتر محمول مع برنامج مصادقة مضمّن، مثل:

  • ميزة فتح القفل، بما في ذلك ميزة Touch ID على جهاز macOS
  • Windows Hello على جهاز Windows

تسجيل الجهاز

يجب أن يتّبع تسجيل الطرف الموثوق للجهاز (RP's) أحد الأجهزة عملية تحقق من المستخدم قوية بما فيه الكفاية. على الجهة المحظورة التأكّد من أنّ تسجيل الدخول إلى موقع الويب باستخدام مصادقة قوية حتى لا يسهل الاستيلاء عليها. توخ الحذر: انعدام الأمان في هذه العملية لتعريض SPC للخطر أيضًا.

بعد أن يصادق الجهة المحظورة على العميل، يمكنه الآن تسجيل جهاز.

سير عمل التسجيل النموذجي على الموقع الإلكتروني للجهة المعتمَدة

رصد الميزات

قبل أن تطلب من العميل تسجيل الجهاز، يجب أن يتأكّد الجهة المحظورة من أنّ يتوافق المتصفّح مع معيار 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 مع ما يلي: المتطلبات:

  • برنامج المصادقة على النظام الأساسي مطلوب: تم platform ميزة authenticatorSelection.authenticatorAttachment.
  • يجب إثبات هوية المستخدم: تم required ميزة authenticatorSelection.userVerification.
  • يجب توفير بيانات الاعتماد القابلة للاكتشاف (المفاتيح الدائمة): تم required ميزة authenticatorSelection.residentKey.

بالإضافة إلى ذلك، حدد "دفعة" الإضافة مع isPayment: true. التحديد هذه الإضافة بدون استيفاء المتطلبات أعلاه سيحدث استثناء

بعض التنبيهات الأخرى:

  • rp.id: اسم مضيف الجهة المحظورة جزء eTLD+1 من نطاق أن يتطابق النطاق مع مكان تسجيله. يمكن استخدامها المصادقة على النطاقات التي تتطابق مع eTLD+1.
  • user.id: تعبير ثنائي لمعرّف المستخدم المعرّف نفسه بعد المصادقة الناجحة، لذلك على الجهة المحظورة توفير معرّف مستخدم متّسق لحامل البطاقة
  • excludeCredentials: مصفوفة من بيانات الاعتماد التي يمكن للجهات المحظورة تجنُّبها تسجيل برنامج المصادقة نفسه

لمزيد من المعلومات حول عملية تسجيل 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.
}

بعد تسجيل ناجح، يتلقى الجهة المحظورة بيانات اعتماد لإرسالها إلى الخادم لإثبات الملكية.

إثبات صحة التسجيل

يجب أن يتحقق الجهة المحظورة على الخادم من بيانات الاعتماد وأن يحتفظ بالمفتاح العام لاستخدامه في وقت لاحق. عملية التسجيل من جهة الخادم مماثلة لتسجيل WebAuthn العادي. لا شيء يجب توفير معلومات إضافية للامتثال لمعيار SPC.

التسجيل من داخل إطار iframe

إذا لم تسجّل الجهة المسدِّدة جهازه لدى الجهة المحظورة (جهة إصدار الدفع)، يجب يمكن للدافع التسجيل على الموقع الإلكتروني للتاجر. بعد إجراء مصادقة ناجحة خلال عملية شراء، يمكن للجهة المحظورة أن تطلب من الجهة المسدِّدة تسجيل جهازه وبشكل غير مباشر، من داخل iframe.

سير عمل التسجيل على الموقع الإلكتروني للتاجر أثناء الدفع.

ولتنفيذ ذلك، يجب أن يسمح التاجر أو أحد الوالدَين صراحةً بهذا الإجراء في إطار iframe باستخدام سياسة الأذونات تتّبع جهة الإصدار الخطوات نفسها لتسجيل برنامج مصادقة ضمن إطار iframe.

تتوفّر طريقتان يتيح للتاجر السماح بالتسجيل:

  1. تضيف علامة iframe في رمز HTML المعروض من نطاق التاجر السمة allow:

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

    تأكَّد من أنّ السمة allow تحتوي على payment وعلى مصدر الجهة المحظورة الذي يستدعي تسجيل WebAuthn.

  2. يتم إرسال مستند الإطار الرئيسي (المعروض من نطاق التاجر) مع عنوان HTTP يتضمّن العنصر Permissions-Policy:

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

الخطوات التالية

بعد تسجيل الجهاز لدى الجهة المعتمَدة، يمكن للعميل تأكيد عمليات الدفع على الموقع الإلكتروني للتاجر باستخدام ميزة "تأكيد الدفع الآمن".