ביצוע אימות באמצעות SMS בשרת

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

שרת האימות הטלפוני אחראי לשלוש משימות:

  1. יצירה של הודעת אימות שכוללת קוד חד-פעמי בפורמט שציפייה של SMS Retriever API בצד הלקוח
  2. הודעת האימות נשלחת אל המכשיר של המשתמש
  3. אימות הקוד החד-פעמי אחרי שהוא נשלח חזרה לשרת והשלמת כל המשימות שאחרי האימות שנדרשות לקצה העורפי

הפרטים לגבי אופן האינטראקציה של האפליקציה עם השרת תלויים בכם. אחת הדרכים הנפוצות היא לחשוף את ה-API ל-REST עם שתי נקודות קצה: אחת שמקבלת בקשות לאימות מספר טלפון מסוים ושולחת הודעות אימות ב-SMS, ונקודת קצה שנייה שמקבלת קודים חד-פעמיים מהאפליקציה.

1. יצירה של הודעת אימות

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

אחרת, התוכן של הודעת האימות יכול להיות כל מה שתבחר. כדאי ליצור הודעה שממנה ניתן לחלץ בקלות את הקוד החד-פעמי בהמשך. לדוגמה, הודעת אימות חוקית עשויה להיראות כך:

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

יצירת קוד חד-פעמי

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

אחת מהדרכים להטמיע קודים חד-פעמיים היא ליצור מספרים אקראיים, ולהשתמש בהם כמפתחות בטבלת מסד הנתונים. לדוגמה, יכול להיות שתוצג הטבלה PendingAuthentications:

מזהה משתמש תוקף הרישיון
123456789... 1234 2017-3-14 1:59

ניתן להשתמש במזהה בקידוד base32 כקוד חד-פעמי.

חישוב מחרוזת ה-hash של האפליקציה

תוכנת Google Play Services משתמשת במחרוזת הגיבוב כדי לקבוע אילו הודעות אימות צריך לשלוח לאפליקציה. מחרוזת הגיבוב מורכבת משם החבילה של האפליקציה ומהאישור של המפתח הציבורי של האפליקציה. כדי ליצור את מחרוזת ה-hash:

  1. אם אתם משתמשים בחתימת אפליקציות ב-Google Play, צריך להוריד את האישור לחתימת אפליקציות (deployment_cert.der) מהקטע חתימת אפליקציות במסוף Google Play.

    לאחר מכן, מייבאים את האישור של חתימת האפליקציה אל מאגר מפתחות זמני:

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    אם חותמים על חבילות ה-APK ישירות, דלגו על השלב הזה.

  2. משיגים את האישור לחתימת האפליקציה — האישור שייבאתם למעלה או האישור שבו אתם משתמשים לחתימה ישירה על חבילות ה-APK — כמחרוזת הקסדצימלית באותיות קטנות.

    לדוגמה, כדי למצוא את מחרוזת ה-hex ממאגר המפתחות הזמני שנוצר למעלה, מקלידים את הפקודה הבאה:

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    

    אם חותמים ישירות על חבילות ה-APK, צריך לציין את מאגר המפתחות בסביבת הייצור ואת כינוי האישור.

  3. אם יצרתם מאגר מפתחות זמני, צריך למחוק אותו.

  4. מוסיפים את מחרוזת הקסדצימלית (hex) לשם החבילה של האפליקציה, עם רווח אחד.

  5. מחשבים את הסכום של SHA-256 של המחרוזת המשולבת. חשוב להסיר רווחים בתחילת השורה או בסופה מהמחרוזת לפני חישוב סכום SHA-256.

  6. מקודד Base64 את הערך הבינארי של הסכום SHA-256. יכול להיות שתצטרכו לפענח קודם את הסכום SHA-256 מפורמט הפלט שלו.

  7. מחרוזת הגיבוב של האפליקציה היא 11 התווים הראשונים של הגיבוב בקידוד base64.

הפקודה הבאה מחשבת את מחרוזת ה-hash ממאגר המפתחות של סביבת הייצור של האפליקציה:

keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

לחלופין, אפשר לאתר את מחרוזת הגיבוב של האפליקציה עם המחלקה AppSignatureHelper מהאפליקציה לדוגמה של SMS רטריבר. עם זאת, אם אתם משתמשים במחלקה המסייעת, חשוב להסיר אותה מהאפליקציה אחרי שמקבלים את מחרוזת הגיבוב. אין להשתמש במחרוזות גיבוב שמחושבות באופן דינמי על ידי הלקוח בהודעות האימות.

2. שליחה של הודעת האימות ב-SMS

אחרי שיצרתם את הודעת האימות, שלחו אותה למספר הטלפון של המשתמש באמצעות מערכת SMS כלשהי.

לדוגמה, תוכלו לקרוא את המאמר אימות אפליקציות באמצעות Twilio SMS באתר למפתחים של Twilio.

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

3. אימות חד-פעמי של הקוד לאחר החזרתו

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

  1. מוודאים שהקוד החד-פעמי תקף ושתוקפו לא פג.
  2. חשוב לתעד שהמשתמש שמקושר לקוד החד-פעמי השלים את האימות של מספר הטלפון.
  3. מסירים את רשומת מסד הנתונים של הקוד החד-פעמי, או מוודאים שלא ניתן יהיה להשתמש באותו קוד שוב בדרך אחרת.

האימות הושלם כשמתעדים את סטטוס האימות של המשתמש ומסירים קוד חד-פעמי ממסד הנתונים.