Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

ยืนยัน ID Tokens

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

ก่อนจะเริ่ม

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

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

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

iOS

วัตถุประสงค์-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
          // ...
}];
Swift
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 ของผู้ใช้หรืออุปกรณ์จากโทเค็นการถอดรหัส

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

Node.js

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

Java

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

Python

# 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 Token Header การอ้างสิทธิ์
alg อัลกอริทึม "RS256"
kid รหัสคีย์ จะต้องสอดคล้องกับหนึ่งในกุญแจสาธารณะที่มีอยู่ใน https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

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

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

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

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