Как проверить кастомный токен?

Я использую аутентификацию и функции firebase для своего проекта. Моя база данных API принадлежит другому провайдеру. Мне нужно сделать несколько обращений к моей базе данных из функций «admin». Мой сервер настроен для проверки токенов jwt firebase с помощью следующей конфигурации (настраиваемая проверка, нельзя использовать администратора firebase):

{
   "type":"RS256",
"jwk_url":"https://www.googleapis.com/service_accounts/v1/jwk/[email protected]",
   "audience":"<firebase-project-id>",
   "issuer":"https://securetoken.google.com/<firebase-project-id>"
}

Это проверяет токены идентификатора правильно, однако не может проанализировать пользовательские токены, созданные admin.auth().createCustomToken, со следующей ошибкой:

Не удалось проверить JWT: JWSError JWSInvalidSignature

Следовательно, я не могу использовать пользовательские токены для аутентификации своих облачных функций, если я не могу их как-то проверить?

Вот как генерируется мой токен функции:

  const uid = "function-worker";
  const claims = {
    "https://hasura.io/jwt/claims": {
      "x-hasura-default-role": "function",
      "x-hasura-allowed-roles": ["function"],
      "x-hasura-user-id": uid,
    },
  };
  const jwt = await admin.auth().createCustomToken(uid, claims);

Сгенерированный jwt затем отправляется на мой сервер hasura согласно https://github.com/hasura/graphql-engine/tree/master/community/sample-apps/firebase-jwt

Следующее выше руководство работает для токенов id, но не для пользовательских токенов. Более подробное объяснение того, как сервер hasura обрабатывает проверку jwt, можно найти здесь https://github.com/hasura/graphql-engine/blob/dcab20a5ee388ebd754a7828de1309a3a2e0eaee/docs/graphql/manual/auth/authentication/jwt.rst#generate-jwt-config


person Ilja    schedule 13.05.2020    source источник
comment
Измените вопрос, чтобы показать, что код, который вы используете, работает не так, как вы ожидаете.   -  person Doug Stevenson    schedule 13.05.2020
comment
@DougStevenson добавил   -  person Ilja    schedule 13.05.2020
comment
А как вы это проверяете? Я как бы ожидал увидеть вызов verifyIdToken   -  person Doug Stevenson    schedule 13.05.2020
comment
Проверка @DougStevenson выполняется сервером hasura graphql, без использования admin sdk, все, что они просят, - это предоставить конфигурацию json, как я написал выше. Я считаю, что здесь выполняется проверка (этот язык не поддерживается firebase) github.com/hasura/graphql-engine/blob/   -  person Ilja    schedule 13.05.2020
comment
@DougStevenson вот подробное объяснение того, как они это делают github.com/hasura/graphql-engine/blob/   -  person Ilja    schedule 13.05.2020


Ответы (2)


Вы можете использовать Firebase REST API для генерации токена идентификатора на стороне сервера. https://firebase.google.com/docs/reference/rest/auth

person Leonardo Alves    schedule 13.05.2020

Создание токена идентификатора для функций firebase

1 - REST API

import fetch from 'node-fetch';
...
const customToken = await admin.auth().createCustomToken(user.uid);
const tokenURL = 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=';

const response = await fetch(tokenURL + API_KEY, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    token: customToken,
    returnSecureToken: true
  })
}).then(r => r.json());

console.log(response.idToken);

2 - Клиент Firebase на сервере

import firebase from "firebase/app";
import "firebase/auth";

admin.initializeApp();
firebase.initializeApp(firebase_config);
...

const token: any = await admin.auth().createCustomToken(user.uid)
.then((customToken: string) =>
  // use custom token to get firebase token
  firebase.auth().signInWithCustomToken(customToken)
    .then((cred: firebase.auth.UserCredential) => cred.user?.getIdToken()))
.catch((e: string) => console.error(e));
person Jonathan    schedule 21.04.2021