Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Xác minh mã thông báo ID

Nếu ứng dụng khách Firebase của bạn giao tiếp với máy chủ phụ trợ tùy chỉnh, bạn có thể cần xác định người dùng hiện đã đăng nhập trên máy chủ đó. Để làm như vậy một cách an toàn, sau khi đăng nhập thành công, hãy gửi mã thông báo ID của người dùng đến máy chủ của bạn bằng HTTPS. Sau đó, trên máy chủ, xác minh tính toàn vẹn và tính xác thực của mã thông báo ID và truy xuất uid từ nó. Bạn có thể sử dụng uid truyền theo cách này để xác định an toàn người dùng hiện đã đăng nhập trên máy chủ của bạn.

Trước khi bắt đầu

Để xác minh mã thông báo ID bằng SDK quản trị Firebase, bạn phải có tài khoản dịch vụ. Thực hiện theo hướng dẫn thiết lập SDK quản trị viên để biết thêm thông tin về cách khởi chạy SDK quản trị viên bằng tài khoản dịch vụ.

Lấy mã thông báo ID trên máy khách

Khi người dùng hoặc thiết bị đăng nhập thành công, Firebase sẽ tạo mã thông báo ID tương ứng nhận dạng duy nhất họ và cấp cho họ quyền truy cập vào một số tài nguyên, chẳng hạn như Cơ sở dữ liệu thời gian thực của Firebase và Bộ nhớ đám mây. Bạn có thể sử dụng lại mã thông báo ID đó để xác định người dùng hoặc thiết bị trên máy chủ phụ trợ tùy chỉnh của mình. Để truy xuất mã thông báo ID từ máy khách, hãy đảm bảo người dùng đã đăng nhập và sau đó lấy mã thông báo ID từ người dùng đã đăng nhập:

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

Thống nhất

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

Web

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

Sau khi có mã thông báo ID, bạn có thể gửi JWT đó tới chương trình phụ trợ của mình và xác thực nó bằng SDK quản trị Firebase hoặc sử dụng thư viện JWT của bên thứ ba nếu máy chủ của bạn được viết bằng ngôn ngữ mà Firebase không hỗ trợ.

Xác minh mã thông báo ID bằng SDK quản trị Firebase

SDK quản trị Firebase có một phương pháp tích hợp để xác minh và giải mã mã thông báo ID. Nếu mã thông báo ID được cung cấp có định dạng chính xác, chưa hết hạn và được ký đúng cách, phương pháp sẽ trả về mã thông báo ID được giải mã. Bạn có thể lấy uid của người dùng hoặc thiết bị từ mã thông báo được giải mã.

Làm theo hướng dẫn thiết lập SDK quản trị để khởi chạy SDK quản trị bằng tài khoản dịch vụ. Sau đó, sử dụng phương thức verifyIdToken() để xác minh mã thông báo ID:

Node.js

// idToken comes from the client app
admin
  .auth()
  .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']

Đi

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;

Xác minh mã thông báo ID yêu cầu một ID dự án. SDK quản trị Firebase cố gắng lấy ID dự án thông qua một trong các phương pháp sau:

  • Nếu SDK được khởi tạo bằng tùy chọn ứng dụng projectId rõ ràng, SDK sẽ sử dụng giá trị của tùy chọn đó.
  • Nếu SDK được khởi tạo bằng thông tin đăng nhập tài khoản dịch vụ, thì SDK sẽ sử dụng trường project_id của đối tượng JSON tài khoản dịch vụ.
  • Nếu biến môi trường GOOGLE_CLOUD_PROJECT được đặt, SDK sẽ sử dụng giá trị của nó làm ID dự án. Biến môi trường này có sẵn cho mã chạy trên cơ sở hạ tầng của Google như Google App Engine và Google Compute Engine.

Xác minh mã thông báo ID bằng thư viện JWT của bên thứ ba

Nếu chương trình phụ trợ của bạn sử dụng ngôn ngữ không được SDK quản trị Firebase hỗ trợ, bạn vẫn có thể xác minh mã thông báo ID. Trước tiên, hãy tìm thư viện JWT của bên thứ ba cho ngôn ngữ của bạn . Sau đó, xác minh tiêu đề, trọng tải và chữ ký của mã thông báo ID.

Xác minh rằng tiêu đề của mã thông báo ID tuân theo các ràng buộc sau:

Tuyên bố về Tiêu đề Mã thông báo ID
alg Thuật toán "RS256"
kid ID khóa Phải tương ứng với một trong các khóa công khai được liệt kê tại https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

Xác minh tải trọng của mã thông báo ID tuân theo các ràng buộc sau:

Yêu cầu về tải trọng mã thông báo ID
exp Thời gian hết hạn Phải có trong tương lai. Thời gian được tính bằng giây kể từ kỷ nguyên UNIX.
iat Được cấp-tại thời điểm Phải trong quá khứ. Thời gian được tính bằng giây kể từ kỷ nguyên UNIX.
aud Khán giả Phải là ID dự án Firebase của bạn, mã nhận dạng duy nhất cho dự án Firebase của bạn, có thể được tìm thấy trong URL của bảng điều khiển của dự án đó.
iss Người phát hành Phải là "https://securetoken.google.com/<projectId>" , nơi <projectId> là cùng một ID dự án sử dụng cho aud trên.
sub Môn học Phải là một chuỗi không trống và phải là uid của người dùng hoặc thiết bị.
auth_time Thời gian xác thực Phải trong quá khứ. Thời điểm người dùng xác thực.

Cuối cùng, đảm bảo rằng các thẻ ID đã được ký kết bởi khóa bí mật tương ứng với dấu hiệu của kid yêu. Lấy khóa công khai từ https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com và sử dụng thư viện JWT để xác minh chữ ký. Sử dụng giá trị của max-age trong tiêu đề Cache-Control của phản hồi từ điểm cuối đó để biết khi nào cần làm mới khóa công khai.

Nếu tất cả các xác minh trên thành công, bạn có thể sử dụng chủ đề ( sub ) của mã thông báo ID làm uid của người dùng hoặc thiết bị tương ứng.