Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ยืนยันโทเค็น ID

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

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

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

รับโทเค็น ID บนไคลเอนต์

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

iOS

Objective-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
  // ...
}
 

Android

 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
  // ...
});
 

C ++

 firebase::auth::User* user = auth->current_user();
if (user != nullptr) {
  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:

Node.js

 // idToken comes from the client app
admin.auth().verifyIdToken(idToken)
  .then(function(decodedToken) {
    let uid = decodedToken.uid;
    // ...
  }).catch(function(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 ต้องใช้ ID โครงการ Firebase Admin SDK พยายามรับ ID โครงการผ่านวิธีใดวิธีหนึ่งต่อไปนี้:

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

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

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

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

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

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

การอ้างสิทธิ์ Pay Token ID
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 ของผู้ใช้หรืออุปกรณ์ที่เกี่ยวข้อง