Nếu ứng dụng khách Firebase của bạn giao tiếp với một máy chủ phụ trợ tuỳ chỉnh,
có thể cần xác định người dùng hiện đang đăng nhập trên máy chủ đó. Để thực hiện việc này
sau khi đăng nhập thành công, hãy gửi mã thông báo mã nhận dạng của người dùng đến máy chủ của bạn một cách an toàn
thông qua HTTPS. Sau đó, trên máy chủ, hãy xác minh tính toàn vẹn và xác thực của
Mã thông báo mã nhận dạng và truy xuất uid
qua mã đó. Bạn có thể sử dụng uid
được truyền trong
theo cách này để nhận dạng người dùng hiện đang đăng nhập trên máy chủ của bạn một cách an toàn.
Trước khi bắt đầu
Để xác minh mã thông báo mã nhận dạng bằng SDK quản trị của Firebase, bạn phải có một dịch vụ tài khoản. Làm theo hướng dẫn thiết lập SDK dành cho quản trị viên để bạn có thể tìm hiểu thêm thông tin về cách khởi chạy SDK dành cho quản trị viên bằng tài khoản dịch vụ.
Truy xuất mã nhận dạng trên ứng dụng
Khi người dùng hoặc thiết bị đăng nhập thành công, Firebase sẽ tạo một là mã thông báo xác định danh tính chính xác của các trang web đó và cấp cho họ quyền truy cập vào một số các tài nguyên, chẳng hạn như Firebase Realtime Database và Cloud Storage. Bạn có thể sử dụng lại mã thông báo mã nhận dạng đó để xác định người dùng hoặc thiết bị trên phần phụ trợ tuỳ chỉnh của bạn máy chủ. Để truy xuất mã thông báo mã nhận dạng từ ứng dụng, hãy đảm bảo người dùng đã đăng nhập rồi nhận mã thông báo nhận dạng từ người dùng đã đăng nhập:
iOS trở lên
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
// ...
}
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 giá trị nhận dạng, bạn có thể gửi JWT đó đến phần phụ trợ và xác thực bằng cách sử dụng SDK quản trị của Firebase hoặc sử dụng JWT của bên thứ ba thư viện của bạn nếu máy chủ của bạn được viết bằng ngôn ngữ mà Firebase không để hỗ trợ ngay lập tức.
Xác minh mã thông báo mã nhận dạng bằng SDK quản trị của Firebase
SDK quản trị của Firebase có một phương thức tích hợp để xác minh và giải mã mã nhận dạng
mã thông báo. Nếu mã thông báo mã nhận dạng được cung cấp có định dạng chính xác, chưa hết hạn và
đã được ký đúng cách, thì phương thức này sẽ trả về mã thông báo giá trị nhận dạng đã giải mã. Bạn có thể tải
uid
người dùng hoặc thiết bị từ mã thông báo đã giải mã.
Làm theo hướng dẫn thiết lập SDK dành cho quản trị viên để khởi chạy
SDK dành cho quản trị viên 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 nhận dạng:
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']
Tiến hành
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;
Quy trình xác minh mã thông báo nhận dạng yêu cầu mã dự án. SDK Quản trị của Firebase cố gắng dùng để lấy mã dự án thông qua một trong các phương thức sau:
- Nếu SDK được khởi chạy bằng một tuỳ chọn ứng dụng
projectId
tường minh, thì SDK sử dụng giá trị của tuỳ chọn đó. - Nếu SDK được khởi tạo bằng thông tin xác thực 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 bạn đặt biến môi trường
GOOGLE_CLOUD_PROJECT
, SDK sẽ sử dụng làm mã 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ư App Engine và Compute Engine.
Xác minh mã thông báo mã nhận dạng 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ữ mà Quản trị viên Firebase không hỗ trợ SDK, bạn vẫn có thể xác minh mã thông báo mã nhận dạng. Đầu tiên, 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 đề, tải trọng và chữ ký của mã thông báo mã nhận dạng.
Xác minh rằng tiêu đề của mã thông báo giá trị nhận dạng tuân thủ các quy tắc ràng buộc sau:
Xác nhận quyền sở hữu tiêu đề mã thông báo giá trị nhận dạng | ||
---|---|---|
alg |
Thuật toán | "RS256" |
kid |
Mã khoá |
Phải tương ứng với một trong các khoá công khai được nêu tại
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
Xác minh rằng tải trọng của mã thông báo mã nhận dạng tuân thủ các điều kiện ràng buộc sau:
Xác nhận tải trọng mã thông báo mã nhận dạng | ||
---|---|---|
exp |
Thời gian hết hạn | Phải là thời điểm trong tương lai. Thời gian được tính bằng giây kể từ UNIX thời gian bắt đầu của hệ thống. |
iat |
Được phát hành tại thời điểm | Phải là ngày trong quá khứ. Thời gian được tính bằng giây kể từ UNIX thời gian bắt đầu của hệ thống. |
aud |
Đối tượng | Phải là mã dự án Firebase, giá trị nhận dạng duy nhất cho Firebase của bạn mà bạn có thể tìm thấy trong URL của bảng điều khiển của dự án đó. |
iss |
Tổ chức phát hành |
Phải là "https://securetoken.google.com/<projectId>" ,
trong đó <projectId> là cùng một mã dự án dùng cho
aud ở trên.
|
sub |
Chủ đề |
Không được là một chuỗi 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 là ngày trong quá khứ. Thời điểm người dùng xác thực. |
Cuối cùng, hãy đảm bảo rằng mã thông báo nhận dạng đã được ký bằng khoá riêng tư tương ứng
đối với thông báo xác nhận quyền sở hữu kid
của mã thông báo. Lấy khoá 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 thời điểm
làm mới khoá công khai.
Nếu tất cả các bước xác minh ở trên đều thành công, bạn có thể sử dụng tiêu đề (sub
)
của mã thông báo nhận dạng dưới dạng uid
của người dùng hoặc thiết bị tương ứng.