Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Проверить идентификационные токены

Если ваше клиентское приложение Firebase взаимодействует с настраиваемым внутренним сервером, вам может потребоваться идентифицировать текущего пользователя, вошедшего в систему на этом сервере. Чтобы сделать это безопасно, после успешного входа отправьте токен идентификатора пользователя на свой сервер с помощью HTTPS. Затем на сервере, проверить целостность и подлинность идентификатора лексемы и получить uid пользователя от него. Вы можете использовать uid пользователя, переданный таким образом , чтобы надежно идентифицировать данный момент зарегистрирован пользователем на сервере.

Прежде чем вы начнете

Чтобы проверить токены ID с помощью Firebase Admin SDK, у вас должна быть учетная запись службы. Следуйте инструкции по установке Admin SDK для получения дополнительной информации о том , как инициализировать Admin SDK с учетной записью службы.

Получение токенов ID на клиентах

Когда пользователь или устройство успешно входит в систему, Firebase создает соответствующий токен идентификатора, который однозначно идентифицирует их и предоставляет им доступ к нескольким ресурсам, таким как база данных Firebase Realtime и облачное хранилище. Вы можете повторно использовать этот токен идентификатора для идентификации пользователя или устройства на настраиваемом внутреннем сервере. Чтобы получить токен идентификатора от клиента, убедитесь, что пользователь вошел в систему, а затем получите токен идентификатора от зарегистрированного пользователя:

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

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();
            }
        }
    });

Единство

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

Интернет

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 изначально не поддерживает.

Проверьте токены ID с помощью 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();

Python

# 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)

C #

FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
    .VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;

Для проверки идентификатора токена требуется идентификатор проекта. SDK Firebase Admin пытается получить идентификатор проекта одним из следующих способов:

  • Если SDK была инициализирована с явным projectId вариантом приложения, то SDK использует значение этой опции.
  • Если SDK была инициализирована с учетной записи службы учетных данных, то SDK использует project_id поле объекта учетной записи службы JSON.
  • Если GOOGLE_CLOUD_PROJECT переменная окружения установлена, то SDK использует его значение в качестве проекта ID. Эта переменная среды доступна для кода, выполняемого в инфраструктуре Google, такой как App Engine и Compute Engine.

Проверить токены ID с помощью сторонней библиотеки 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 Время аутентификации Должно быть в прошлом. Время аутентификации пользователя.

Наконец, убедитесь , что ID маркер был подписан секретным ключом , соответствующим маркеру в kid претензии. Захватите открытый ключ из https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com и использовать библиотеку JWT для проверки подписи. Используйте значение max-age в Cache-Control заголовке ответа от этой конечной точки , чтобы знать , когда для обновления открытых ключей.

Если все вышеперечисленные проверки успешны, вы можете использовать эту тему ( sub ) от ID лексемы как uid соответствующего пользователя или устройства.