Если ваше клиентское приложение Firebase взаимодействует с пользовательским бэкенд-сервером, вам может потребоваться идентифицировать текущего вошедшего в систему пользователя на этом сервере. Для безопасной идентификации после успешного входа отправьте токен идентификатора пользователя на свой сервер по протоколу HTTPS. Затем на сервере проверьте целостность и подлинность токена идентификатора и извлеките из него uid . Вы можете использовать переданный таким образом uid для безопасной идентификации текущего вошедшего в систему пользователя на своем сервере.
Прежде чем начать
Для проверки токенов ID с помощью Firebase Admin SDK необходима учётная запись службы. Чтобы узнать больше о том, как инициализировать Admin SDK с помощью учётной записи службы, следуйте инструкциям по настройке Admin SDK .
Извлечение идентификационных токенов на клиентах
Когда пользователь или устройство успешно входит в систему, Firebase создаёт соответствующий уникальный идентификатор, который предоставляет доступ к различным ресурсам, таким как Firebase Realtime Database и Cloud Storage . Вы можете повторно использовать этот идентификатор для идентификации пользователя или устройства на вашем внутреннем сервере. Чтобы получить идентификатор от клиента, убедитесь, что пользователь вошёл в систему, а затем получите его у вошедшего пользователя:
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
          // ...
}];
Быстрый
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
});
Получив идентификационный токен, вы можете отправить этот JSON Web Token (JWT) на свой бэкэнд и проверить его с помощью Firebase Admin SDK или с помощью сторонней библиотеки JWT, если ваш сервер написан на языке, который Firebase изначально не поддерживает.
Проверка идентификаторов токенов с помощью Firebase Admin SDK
 В 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
  });
Ява
// 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;
Для проверки токена ID требуется идентификатор проекта. Firebase Admin SDK пытается получить идентификатор проекта одним из следующих методов:
-  Если SDK был инициализирован с явной опцией приложения projectId, SDK использует значение этой опции.
-  Если SDK был инициализирован с учетными данными сервисной учетной записи, SDK использует поле project_idJSON-объекта сервисной учетной записи.
-  Если задана переменная окружения GOOGLE_CLOUD_PROJECT, SDK использует её значение в качестве идентификатора проекта. Эта переменная окружения доступна для кода, работающего в инфраструктуре Google, такой как App Engine и Compute Engine .
Проверка идентификационных токенов с использованием сторонней библиотеки JWT
Если ваш бэкенд написан на языке, не поддерживаемом Firebase Admin SDK, вы всё равно можете проверить токены ID. Сначала найдите стороннюю библиотеку JWT для вашего языка . Затем проверьте заголовок, полезную нагрузку и подпись токена ID.
Убедитесь, что заголовок токена ID соответствует следующим ограничениям:
| Утверждения заголовка идентификатора токена | ||
|---|---|---|
| alg | Алгоритм | "RS256" | 
| kid | Идентификатор ключа | Должен соответствовать одному из открытых ключей, перечисленных на странице https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com | 
Убедитесь, что полезная нагрузка токена ID соответствует следующим ограничениям:
| Требования к полезной нагрузке токена ID | ||
|---|---|---|
| exp | Время истечения срока действия | Должно быть в будущем. Время измеряется в секундах с начала эпохи UNIX. | 
| iat | Выдано в момент времени | Должно быть в прошлом. Время измеряется в секундах с начала эпохи UNIX. | 
| aud | Аудитория | Должен быть идентификатор вашего проекта Firebase — уникальный идентификатор вашего проекта Firebase, который можно найти в URL-адресе консоли этого проекта. | 
| 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 соответствующего пользователя или устройства.