רישום אישור של תשלום מאובטח

כדי להשתמש באישור תשלום מאובטח (SPC) בעסקה, הלקוח צריך קודם לרשום מאמת. התהליך הזה דומה מאוד לתהליך ההרשמה ל-WebAuthn, בתוספת תוסף תשלום.

במאמר הזה, הבנקים המנפיקים שפועלים כצדדים מסתמכים (RP) יכולים ללמוד איך להטמיע רישום SPC. חוויית המשתמש מוסברת בפירוט בסקירה הכללית על אישור תשלום מאובטח.

כיצד פועל הרישום של אישור תשלום מאובטח?

SPC הוא תוסף של תקן WebAuthn.

החל מאפריל 2022, SPC תומכת במאמתי משתמשים של פלטפורמות אימות משתמשים (UVPA) במחשב בלבד. פירוש הדבר הוא שהלקוח צריך להיות במחשב שולחני או במחשב נייד עם מאמת חשבונות מוטמע כמו:

  • ביטול נעילה באמצעות התכונה 'מזהה מגע' במכשירי 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.authenticatorAttachment הוא platform.
  • נדרש אימות המשתמש: authenticatorSelection.userVerification הוא required.
  • נדרשים פרטי כניסה שניתנים לגילוי (מפתחות תושבים): authenticatorSelection.residentKey הוא required.

בנוסף, צריך לציין תוסף 'תשלום' באמצעות isPayment: true. ציון התוסף הזה בלי לעמוד בדרישות שצוינו למעלה יגרום לחריגה

כמה נקודות שחשוב לשים לב אליהן:

  • rp.id: שם המארח של הגורם המוגבל. החלק 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")
    

השלבים הבאים

לאחר רישום המכשיר אצל הצד הנסמך, הלקוח יכול לאשר תשלומים באתר של המוכר באמצעות 'אישור תשלום מאובטח'.