Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

驗證ID令牌

如果您的Firebase客戶端應用程序與自定義後端服務器通信,則可能需要識別該服務器上當前登錄的用戶。為了安全地執行此操作,請在成功登錄後使用HTTPS將用戶的ID令牌發送到您的服務器。然後,在服務器上,驗證ID令牌的完整性和真實性,並從中檢索uid 。您可以使用以這種方式傳輸的uid來安全標識服務器上當前登錄的用戶。

在你開始之前

要使用Firebase Admin SDK驗證ID令牌,您必須具有服務帳戶。請按照Admin SDK設置說明進行操作 ,以獲取有關如何使用服務帳戶初始化Admin 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
          // ...
}];
 
迅速
 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
  // ...
});
 

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本身不支持的語言編寫)來對其進行驗證。

使用Firebase Admin SDK驗證ID令牌

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) 

C#

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

ID令牌驗證需要一個項目ID。 Firebase Admin SDK嘗試通過以下方法之一獲取項目ID:

  • 如果SDK是使用顯式projectId應用程序選項初始化的,則SDK將使用該選項的值。
  • 如果使用服務帳戶憑據初始化了SDK,則SDK將使用服務帳戶JSON對象的project_id字段。
  • 如果設置了GOOGLE_CLOUD_PROJECT環境變量,則SDK會將其值用作項目ID。此環境變量可用於在Google基礎架構(例如Google App Engine和Google Compute Engine)上運行的代碼。

使用第三方JWT庫驗證ID令牌

如果您的後端使用的是Firebase Admin SDK不支持的語言,則您仍然可以驗證ID令牌。首先, 找到適合您的語言的第三方JWT庫 。然後,驗證ID令牌的標頭,有效負載和簽名。

驗證ID令牌的標頭是否符合以下約束:

ID令牌頭聲明
alg 算法 "RS256"
kid 密鑰ID 必須與https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com列出的公共密鑰之一相對應。

驗證ID令牌的有效載荷是否符合以下約束:

ID令牌有效負載聲明
exp 到期時間必須在將來。時間是自UNIX時代以來的秒數。
iat 發行時間必須是過去的。時間是自UNIX時代以來的秒數。
aud 聽眾必須是Firebase項目ID,即Firebase項目的唯一標識符,可以在該項目的控制台的URL中找到。
iss 發行人必須為"https://securetoken.google.com/<projectId>" ,其中<projectId>是用於上述aud的相同項目ID。
sub 學科必須為非空字符串,並且必須為用戶或設備的uid
auth_time 認證時間必須是過去的。用戶認證的時間。

最後,確保ID令牌已由對應於該令牌的kid聲明的私鑰簽名。從https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com獲取公共密鑰,並使用JWT庫來驗證簽名。使用該端點的響應的Cache-Control標頭中的max-age值可以知道何時刷新公共密鑰。

如果以上所有驗證均成功,則可以將ID令牌的主題( sub )用作相應用戶或設備的uid