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

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

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

איך פועלת ההרשמה ל-Secure Payment Confirmation?

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.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")
    

השלבים הבאים

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