ยืนยัน ID Tokens

หากแอปไคลเอ็นต์ Firebase ของคุณสื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดเอง คุณอาจต้องระบุผู้ใช้ที่ลงชื่อเข้าใช้ในปัจจุบันบนเซิร์ฟเวอร์นั้น เพื่อความปลอดภัย หลังจากลงชื่อเข้าใช้สำเร็จ ให้ส่งโทเค็น ID ของผู้ใช้ไปยังเซิร์ฟเวอร์ของคุณโดยใช้ HTTPS จากนั้นบนเซิร์ฟเวอร์ ให้ตรวจสอบความสมบูรณ์และความถูกต้องของโทเค็น ID และดึง uid จากโทเค็นนั้น คุณสามารถใช้ uid ที่ส่งในลักษณะนี้เพื่อระบุผู้ใช้ที่ลงชื่อเข้าใช้ในปัจจุบันบนเซิร์ฟเวอร์ของคุณอย่างปลอดภัย

ก่อนที่คุณจะเริ่ม

หากต้องการยืนยันโทเค็น ID ด้วย Firebase Admin SDK คุณต้องมีบัญชีบริการ ทำตาม คำแนะนำการตั้งค่า Admin SDK เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเริ่มต้น Admin SDK ด้วยบัญชีบริการ

ดึงโทเค็น ID บนไคลเอนต์

เมื่อผู้ใช้หรืออุปกรณ์ลงชื่อเข้าใช้สำเร็จ Firebase จะสร้างโทเค็น ID ที่เกี่ยวข้องซึ่งระบุตัวตนได้โดยไม่ซ้ำกัน และให้สิทธิ์ในการเข้าถึงทรัพยากรต่างๆ เช่น ฐานข้อมูลเรียลไทม์ของ Firebase และที่เก็บข้อมูลบนคลาวด์ คุณสามารถใช้โทเค็น ID นั้นซ้ำเพื่อระบุผู้ใช้หรืออุปกรณ์บนเซิร์ฟเวอร์แบ็กเอนด์ที่คุณกำหนดเองได้ หากต้องการดึงโทเค็น ID จากไคลเอ็นต์ ตรวจสอบให้แน่ใจว่าผู้ใช้ลงชื่อเข้าใช้แล้ว จากนั้นรับโทเค็น ID จากผู้ใช้ที่ลงชื่อเข้าใช้:

ไอโอเอส+

วัตถุประสงค์-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
                           completion:^(NSString *_Nullable idToken,
                                        NSError *_Nullable error) {
          if (error) {
            // Handle error
            return;
          }

          // Send token to your backend via HTTPS
          // ...
}];
สวิฟท์
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
  if let error = error {
    // Handle error
    return;
  }

  // Send token to your backend via HTTPS
  // ...
}

หุ่นยนต์

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
        public void onComplete(@NonNull Task<GetTokenResult> task) {
            if (task.isSuccessful()) {
                String idToken = task.getResult().getToken();
                // Send token to your backend via HTTPS
                // ...
            } else {
                // Handle error -> task.getException();
            }
        }
    });

ความสามัคคี

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("TokenAsync was canceled.");
   return;
  }

  if (task.IsFaulted) {
    Debug.LogError("TokenAsync encountered an error: " + task.Exception);
    return;
  }

  string idToken = task.Result;

  // Send token to your backend via HTTPS
  // ...
});

ซี++

firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
  firebase::Future<std::string> idToken = user.GetToken(true);

  // Send token to your backend via HTTPS
  // ...
}

เว็บ

firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});

เมื่อคุณมีโทเค็น ID แล้ว คุณสามารถส่ง JWT นั้นไปยังแบ็กเอนด์ของคุณและตรวจสอบโดยใช้ Firebase Admin SDK หรือใช้ไลบรารี JWT บุคคลที่สาม หากเซิร์ฟเวอร์ของคุณเขียนในภาษาที่ Firebase ไม่รองรับโดยกำเนิด

ตรวจสอบโทเค็น ID โดยใช้ Firebase Admin SDK

Firebase Admin SDK มีวิธีการตรวจสอบและถอดรหัสโทเค็น ID ในตัว หากโทเค็น ID ที่ให้มามีรูปแบบที่ถูกต้อง ยังไม่หมดอายุ และมีการลงนามอย่างถูกต้อง วิธีการจะส่งคืนโทเค็น ID ที่ถอดรหัสแล้ว คุณสามารถดึง uid ของผู้ใช้หรืออุปกรณ์จากโทเค็นที่ถอดรหัสได้

ปฏิบัติตาม คำแนะนำในการตั้งค่า Admin SDK เพื่อเริ่มต้น Admin SDK ด้วยบัญชีบริการ จากนั้นใช้เมธอด verifyIdToken() เพื่อตรวจสอบโทเค็น ID:

โหนด js

// idToken comes from the client app
getAuth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((error) => {
    // Handle error
  });

ชวา

// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

หลาม

# id_token comes from the client app (shown above)

decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']

ไป

client, err := app.Auth(ctx)
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
	log.Fatalf("error verifying ID token: %v\n", err)
}

log.Printf("Verified ID token: %v\n", token)

ค#

FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
    .VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;

การยืนยันโทเค็น ID ต้องใช้รหัสโปรเจ็กต์ Firebase Admin SDK พยายามรับรหัสโปรเจ็กต์ผ่านวิธีใดวิธีหนึ่งต่อไปนี้:

  • หาก SDK เริ่มต้นด้วยตัวเลือกแอป projectId ที่ชัดเจน SDK จะใช้ค่าของตัวเลือกนั้น
  • หากเริ่มต้น SDK ด้วยข้อมูลรับรองบัญชีบริการ SDK จะใช้ช่อง project_id ของออบเจ็กต์ JSON ของบัญชีบริการ
  • หากมีการตั้งค่าตัวแปรสภาพแวดล้อม GOOGLE_CLOUD_PROJECT SDK จะใช้ค่าของตัวแปรนั้นเป็นรหัสโปรเจ็กต์ ตัวแปรสภาพแวดล้อมนี้ใช้ได้กับโค้ดที่ทำงานบนโครงสร้างพื้นฐานของ Google เช่น App Engine และ Compute Engine

ตรวจสอบโทเค็น ID โดยใช้ไลบรารี JWT บุคคลที่สาม

หากแบ็กเอนด์ของคุณเป็นภาษาที่ไม่รองรับโดย Firebase Admin SDK คุณยังคงยืนยันโทเค็น ID ได้ ขั้นแรก ค้นหาไลบรารี JWT บุคคลที่สามสำหรับภาษาของคุณ จากนั้น ตรวจสอบส่วนหัว เพย์โหลด และลายเซ็นของโทเค็น ID

ตรวจสอบว่าส่วนหัวของโทเค็น ID เป็นไปตามข้อจำกัดต่อไปนี้:

การอ้างสิทธิ์ส่วนหัวโทเค็น ID
alg อัลกอริทึม "RS256"
kid รหัสคีย์ ต้องสอดคล้องกับคีย์สาธารณะรายการใดรายการหนึ่งที่ https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

ตรวจสอบว่าเพย์โหลดของโทเค็น ID เป็นไปตามข้อจำกัดต่อไปนี้:

การเรียกร้องเพย์โหลด ID Token
exp เวลาหมดอายุ จะต้องอยู่ในอนาคต เวลาถูกวัดเป็นวินาทีนับตั้งแต่ยุค UNIX
iat ออก ณ เวลา จะต้องเป็นอดีต เวลาถูกวัดเป็นวินาทีนับตั้งแต่ยุค UNIX
aud ผู้ชม ต้องเป็นรหัสโปรเจ็กต์ Firebase ของคุณ ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันสำหรับโปรเจ็กต์ Firebase ของคุณ ซึ่งดูได้ใน URL ของคอนโซลของโปรเจ็กต์นั้น
iss ผู้ออก ต้องเป็น "https://securetoken.google.com/<projectId>" โดยที่ <projectId> เป็นรหัสโปรเจ็กต์เดียวกับที่ใช้สำหรับ aud ข้างต้น
sub เรื่อง ต้องเป็นสตริงที่ไม่ว่างเปล่าและต้องเป็น uid ของผู้ใช้หรืออุปกรณ์
auth_time เวลาการรับรองความถูกต้อง จะต้องเป็นอดีต เวลาที่ผู้ใช้รับรองความถูกต้อง

สุดท้ายนี้ ตรวจสอบให้แน่ใจว่าโทเค็น ID ได้รับการลงนามโดยคีย์ส่วนตัวที่สอดคล้องกับการอ้างสิทธิ์ kid ของโทเค็น รับรหัสสาธารณะจาก https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com และใช้ไลบรารี JWT เพื่อตรวจสอบลายเซ็น ใช้ค่าของ max-age ในส่วนหัว Cache-Control ของการตอบกลับจากจุดสิ้นสุดนั้นเพื่อทราบว่าเมื่อใดควรรีเฟรชคีย์สาธารณะ

หากการตรวจสอบข้างต้นทั้งหมดสำเร็จ คุณสามารถใช้หัวเรื่อง ( sub ) ของโทเค็น ID เป็น uid ของผู้ใช้หรืออุปกรณ์ที่เกี่ยวข้องได้