驗證 ID 權杖

如果您的 Firebase 用戶端應用程式與自訂後端伺服器通訊, 可能需要識別目前登入該伺服器上的使用者。方法如下 成功登入後,將使用者的 ID 權杖傳送至您的伺服器 存取 HTTPS接著,在伺服器上驗證 ID 權杖,然後從中擷取 uid。您可以使用傳入的 uid 這樣就能在伺服器上安全地識別目前登入的使用者。

事前準備

如要透過 Firebase Admin SDK 驗證 ID 權杖,你必須擁有 讓他們使用服務帳戶按照 Admin SDK 設定操作說明操作, 。

在用戶端擷取 ID 權杖

使用者或裝置成功登入後,Firebase 就會建立對應的 ID 權杖,可明確識別這些權杖並授予其存取數 例如 Firebase Realtime DatabaseCloud 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
          // ...
}];
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();
            }
        }
    });

Unity

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.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 不支援的語言編寫) 原生支援

使用 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
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']

Go

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這個環境變數適用於 程式碼在 App Engine 和 Google 基礎架構上 Compute Engine

使用第三方 JWT 程式庫驗證 ID 權杖

如果後端使用不是由 Firebase 管理員支援的語言 但您還是可以驗證 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 以來的時間 (以秒為單位) Epoch 時間。
iat 核發時間 必須設為過去的時間。時間的單位為從 UNIX 以來的時間 (以秒為單位) Epoch 時間。
aud 目標對象 必須是 Firebase 專案 ID,也就是 Firebase 的專屬 ID 專案,前往該專案的控制台網址即可。
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