Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Если ваше клиентское приложение Firebase взаимодействует с настраиваемым внутренним сервером, вам может потребоваться идентифицировать пользователя, вошедшего в систему на этом сервере. Чтобы сделать это безопасно, после успешного входа отправьте токен идентификатора пользователя на ваш сервер с помощью HTTPS. Затем на сервере проверьте целостность и подлинность токена ID и извлеките из него 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
  // ...
}

Андроид

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 != 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
});

Когда у вас есть токен ID, вы можете отправить этот JWT на свой сервер и проверить его с помощью Firebase Admin SDK или с помощью сторонней библиотеки JWT, если ваш сервер написан на языке, который Firebase изначально не поддерживает.

Проверка токенов ID с помощью Firebase Admin SDK

Firebase Admin SDK имеет встроенный метод проверки и декодирования токенов 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;

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

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

Проверка токенов ID с помощью сторонней библиотеки JWT.

Если язык вашего бэкэнда не поддерживается Firebase Admin SDK, вы все равно можете проверить токены ID. Во-первых, найдите стороннюю 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 соответствующего пользователя или устройства.