אימות מספר טלפון ב-Firebase ב-Android

בדף הזה נסביר איך להשתמש ב-Firebase Phone Number Verification באפליקציית Android. בסקירה הכללית מופיע תיאור כללי של התכונה הזו.

בדף הזה מוסבר איך לבצע שילוב עם Firebase PNV באמצעות API מאוחד עם קריאה יחידה. הפעלת method יחידה מטפלת בכל תהליך המשתמש Firebase PNV, החל מקבלת הסכמת המשתמש ועד להפעלת שיחות הרשת הנדרשות אל Firebase PNVהקצה העורפי. בשיטה הזו, תהליך השילוב מצטמצם להפעלת method אחת.

מומלץ לרוב המפתחים להשתמש ב-API הזה. עם זאת, אם יש לכם דרישות ספציפיות שהספרייה לא עונה עליהן, תוכלו לעיין בדף התאמה אישית של תהליך Firebase Phone Number Verification כדי לקבל מידע על הטמעה של תהליך מותאם אישית.

לפני שמתחילים

עליך לפרסם את מדיניות הפרטיות של האפליקציה באתר שזמין לציבור. בדף הזה אתם צריכים להסביר למשתמשים איך אתם משתמשים במספרי הטלפון שמתקבלים באמצעות Firebase Phone Number Verification. ספריית Firebase PNV תקושר לדף הזה כשתבקש הסכמה מהמשתמשים לשתף את מספר הטלפון שלהם עם האפליקציה שלכם.

1. הגדרת פרויקט Firebase

  1. אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט Android.

  2. נדרש מינוי לתוכנית Blaze כדי להשתמש ב-Firebase PNV. אם עדיין לא שדרגתם את הפרויקט לתוכנית התמחור Blaze עם תשלום לפי שימוש, עליכם לעשות זאת.

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

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

  4. פותחים את פרויקט Firebase במסוף Google Cloud ומפעילים את Firebase Phone Number Verification API.

  5. בדף Credentials במסוף, פותחים את מפתח ה-API של Android ומוסיפים את Firebase Phone Number Verification API לרשימת ממשקי ה-API שנבחרו.

2. להוסיף את ספריית Firebase PNV לאפליקציה

בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל <project>/<app-module>/build.gradle.kts או <project>/<app-module>/build.gradle), מוסיפים את התלות בספריית Firebase Phone Number Verification ל-Android.

dependencies {
    // Add the dependency for the Firebase Phone Number Verification library
    implementation("com.google.firebase:firebase-pnv:16.0.0-beta01")
}

3. אופציונלי: בדיקת תמיכה ב-Firebase PNV

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

כדי לבדוק את התאימות של המכשיר, קוראים לשיטה getVerificationSupportInfo():

Kotlin

import com.google.firebase.pnv.FirebasePhoneNumberVerification
// Get an instance of the SDK.
val fpnv = FirebasePhoneNumberVerification.getInstance()

// Check all SIMs for support.
fpnv.getVerificationSupportInfo()
  .addOnSuccessListener { results ->
    if (results.any { it.isSupported() }) {
      // At least one SIM is supported; proceed with FPNV flow
    } else {
      // No SIMs are supported, so fall back to SMS verification.
    }
  }
  .addOnFailureListener { e ->
    // Handle error.
  }

ה-getVerificationSupportInfo() מחזיר רשימה של אובייקטים מסוג VerificationSupportResult, אחד לכל חריץ לכרטיס SIM. אם לפחות כרטיס SIM אחד נתמך, אפשר להמשיך בתהליך Firebase PNV.

4. התחלת תהליך האימות

כדי להתחיל את התהליך של Firebase PNV, יוצרים מופע חדש של FirebasePhoneNumberVerification ומעבירים הקשר של Activity. הקשר של Activity נחוץ כדי שערכת ה-SDK תציג למשתמש מסך בקשת הסכמה. לאחר מכן, קוראים ל-method‏ getVerifiedPhoneNumber() של האובייקט:

Kotlin

// Get an instance of the SDK _with an Activity context_:
val fpnv = FirebasePhoneNumberVerification.getInstance(this@MainActivity)

// Call getVerifiedPhoneNumber
fpnv.getVerifiedPhoneNumber("https://example.com/privacy-policy")
  .addOnSuccessListener { result ->
    val phoneNumber = result.getPhoneNumber()
    val token = result.getToken()
    // Verification successful. Send token to your backend.
  }
  .addOnFailureListener { e ->
    // Handle failures, such as the user declining consent or a network error.
  }

בשיטה getVerifiedPhoneNumber() מתבצע תהליך האימות המלא של מספר הטלפון, כולל:

  • שימוש ב'מנהל פרטי הכניסה' ב-Android כדי לקבל את הסכמת המשתמש לשיתוף מספר הטלפון שלו.
  • שליחת הבקשה אל ה-backend של Firebase PNV.
  • הפונקציה מחזירה מספר טלפון מאומת של המכשיר.

5. שימוש בטוקן Firebase PNV

אם התהליך יצליח, method‏ getVerifiedPhoneNumber() יחזיר את מספר הטלפון המאומת ואסימון חתום שמכיל אותו. אתם יכולים להשתמש בנתונים האלה באפליקציה שלכם, כמו שמתואר במדיניות הפרטיות שלכם.

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

  • האסימון נחתם באמצעות אחד מהמפתחות שפורסמו בנקודת הקצה של Firebase PNV JWKS:

    https://fpnv.googleapis.com/v1beta/jwks
    
  • הטענות לגבי קהל היעד והגורם המנפיק מכילות את מספר הפרויקט ב-Firebase והן בפורמט הבא:

    https://fpnv.googleapis.com/projects/FIREBASE_PROJECT_NUMBER
    

    מספר פרויקט Firebase מופיע בדף הגדרות הפרויקט במסוף Firebase.

  • הטוקן עדיין בתוקף.

דוגמה

לדוגמה, אפליקציית Express.js הבאה מקבלת אסימון Firebase PNV מבקשת HTTP POST ומשתמשת בספריית אימות JWT כדי לבדוק את החתימה ואת הטענות של האסימון:

Node.js

import express from "express";
import { JwtVerifier } from "aws-jwt-verify";

// Find your Firebase project number in the Firebase console.
const FIREBASE_PROJECT_NUMBER = "123456789";

// The issuer and audience claims of the FPNV token are specific to your
// project.
const issuer = `https://fpnv.googleapis.com/projects/${FIREBASE_PROJECT_NUMBER}`;
const audience = `https://fpnv.googleapis.com/projects/${FIREBASE_PROJECT_NUMBER}`;

// The JWKS URL contains the current public signing keys for FPNV tokens.
const jwksUri = "https://fpnv.googleapis.com/v1beta/jwks";

// Configure a JWT verifier to check the following:
// - The token is signed by Google
// - The issuer and audience claims match your project
// - The token has not yet expired (default behavior)
const fpnvVerifier = JwtVerifier.create({ issuer, audience, jwksUri });

const app = express();

app.post('/verifiedPhoneNumber', async (req, res) => {
    if (!req.body) return res.sendStatus(400);
    // Get the token from the body of the request.
    const fpnvToken = req.body;
    try {
        // Attempt to verify the token using the verifier configured above.
        const verifiedPayload = await fpnvVerifier.verify(fpnvToken);

        // If verification succeeds, the subject claim of the token contains the
        // verified phone number. You can use this value however it's needed by
        // your app.
        const verifiedPhoneNumber = verifiedPayload.sub;
        // (Do something with it...)

        return res.sendStatus(200);
    } catch {
        // If verification fails, reject the token.
        return res.sendStatus(400);
    }
});

app.listen(3000);

כניסה לאפליקציה ב-Firebase

דוגמה לשימוש באסימון Firebase PNV בתהליך כניסה של Firebase Authentication מופיעה בדף אימות באמצעות Firebase באמצעות Firebase Phone Number Verification.