Если ваше клиентское приложение Firebase взаимодействует с пользовательским внутренним сервером, вам может потребоваться идентифицировать текущего пользователя, вошедшего в систему на этом сервере. Чтобы сделать это безопасно, после успешного входа в систему отправьте токен идентификатора пользователя на свой сервер по протоколу HTTPS. Затем на сервере проверьте целостность и подлинность токена ID и получите из него uid
. Вы можете использовать переданный таким образом uid
для безопасной идентификации пользователя, вошедшего в систему на вашем сервере.
Прежде чем начать
Чтобы проверить токены идентификатора с помощью Firebase Admin SDK, у вас должна быть учетная запись службы. Следуйте инструкциям по настройке Admin SDK для получения дополнительной информации о том, как инициализировать Admin SDK с помощью учетной записи службы.
Получение токенов идентификатора на клиентах
Когда пользователь или устройство успешно входит в систему, Firebase создает соответствующий токен идентификатора, который уникально идентифицирует его и предоставляет ему доступ к нескольким ресурсам, таким как Firebase Realtime Database и Cloud Storage . Вы можете повторно использовать этот идентификационный токен для идентификации пользователя или устройства на вашем пользовательском внутреннем сервере. Чтобы получить токен идентификатора от клиента, убедитесь, что пользователь вошел в систему, а затем получите токен идентификатора от вошедшего в систему пользователя:
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
// ...
});
С++
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
});
Получив токен идентификатора, вы можете отправить этот JWT на свой бэкэнд и проверить его с помощью Firebase Admin SDK или с помощью сторонней библиотеки JWT, если ваш сервер написан на языке, который Firebase изначально не поддерживает.
Проверьте токены идентификатора с помощью Firebase Admin SDK
Firebase Admin SDK имеет встроенный метод проверки и декодирования токенов идентификатора. Если предоставленный токен идентификатора имеет правильный формат, не истек и правильно подписан, метод возвращает декодированный токен идентификатора. Вы можете получить uid
пользователя или устройства из декодированного токена.
Следуйте инструкциям по настройке Admin SDK , чтобы инициализировать Admin SDK с помощью учетной записи службы. Затем используйте verifyIdToken()
для проверки токена идентификатора:
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((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)
С#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
Для проверки идентификатора токена требуется идентификатор проекта. Firebase Admin SDK пытается получить идентификатор проекта одним из следующих методов:
- Если SDK был инициализирован с явным параметром приложения
projectId
, SDK использует значение этого параметра. - Если SDK был инициализирован с учетными данными учетной записи службы, SDK использует поле
project_id
объекта JSON учетной записи службы. - Если установлена переменная среды
GOOGLE_CLOUD_PROJECT
, SDK использует ее значение в качестве идентификатора проекта. Эта переменная среды доступна для кода, выполняющегося в инфраструктуре Google, например App Engine и Compute Engine .
Проверьте токены идентификатора с помощью сторонней библиотеки JWT.
Если ваш бэкэнд использует язык, не поддерживаемый Firebase Admin SDK, вы все равно можете проверить токены идентификатора. Сначала найдите стороннюю библиотеку JWT для вашего языка . Затем проверьте заголовок, полезную нагрузку и подпись токена идентификатора.
Убедитесь, что заголовок токена идентификатора соответствует следующим ограничениям:
Утверждения заголовка токена идентификатора | ||
---|---|---|
alg | Алгоритм | "RS256" |
kid | Идентификатор ключа | Должен соответствовать одному из открытых ключей, перечисленных на странице https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com |
Убедитесь, что полезная нагрузка токена идентификатора соответствует следующим ограничениям:
Заявки на полезную нагрузку токена идентификатора | ||
---|---|---|
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
соответствующего пользователя или устройства.