Catch up on everything we announced at this year's Firebase Summit. Learn more

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

Если ваше клиентское приложение 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 соответствующего пользователя или устройства.