У токена Firebase ID есть неверное утверждение "aud" (аудитория) при звонке из конечной точки, подключенной к функциям Google - PullRequest
0 голосов
/ 20 января 2020

Я использую конечные точки Google в качестве шлюза API, который работает в службе контейнеров Google Run. Путь API указывает на функцию Google (node js). Вызовы к шлюзу API поступают из веб-приложения (а именно из браузера).

Один из путей: /login, который аутентифицирует пользователя в firebase с использованием метода firebase.auth().signInWithEmailAndPassword. Я получаю идентификатор токена пользователя и отправляю его обратно в заголовок ответа (аутентификационный носитель) обратно в браузер. Это работает, как и ожидалось.

Когда выполняются другие запросы (например, /check) к конечной точке, токен (в заголовке) включается. Я хотел проверить правильность токена с помощью метода Firebase Admin перед обработкой любых запросов. Код в функции Google, который делает это для одного из маршрутов, выглядит следующим образом:

...

const decodeIdToken = async (req, res, next) => {
  // Read the ID Token from the Authorization header.
  const idToken = req.headers.authorization.split('Bearer ')[1];
  try {
    const decodedIdToken = await admin.auth().verifyIdToken(idToken);
    req.decodedToken = decodedIdToken;
    next();
    return;
  } catch (error) {
    return res.status(403).json({
      status: 'failure',
      data: null,
      error: error.message
    });
  }
};

// use decodeIdToken as middleware
app.post('/check', decodeIdToken, (req, res, next) => {
  return res.json({
    status: 'success',
    data: req.decodedToken,
    error: null
  });
});

Когда я вызываю (через Почтальон) маршруты, напрямую вызывая триггер функции Google оба маршрута работа. Однако когда я вызываю конечные точки Google , которые указывают на функцию Google, я получаю следующую ошибку при использовании объекта администратора Firebase:

Маркер Firebase ID имеет неверный \ "aud \" "(аудитория) претензия. Ожидаемый \ "PROJECT-ID \", но получил \ "https://us-central1-PROJECT-ID.cloudfunctions.net/FUNCTION-NAME \". Убедитесь, что маркер ID происходит из того же проекта Firebase, что и учетная запись службы, используемая для аутентификации этого SDK. См. https://firebase.google.com/docs/auth/admin/verify-id-tokens для получения подробной информации о том, как получить идентификатор токена

При настройке объекта администратора Firebase в NodeJs я попытался сделать следующее:

const admin = require('firebase-admin');
admin.initializeApp();

а также

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://PROJECT-ID.firebaseio.com"
});

1 Ответ

0 голосов
/ 21 января 2020

Следующее сработало не работает (см. Комментарий ниже):

В openapi-functions.yaml добавьте определение безопасности в соответствии с рекомендациями документов

securityDefinitions:
    firebase:
      authorizationUrl: ""
      flow: "implicit"
      type: "oauth2"
      # Replace YOUR-PROJECT-ID with your project ID
      x-google-issuer: "https://securetoken.google.com/YOUR-PROJECT-ID"
      x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
      x-google-audiences: "YOUR-PROJECT-ID"

Затем, напротив пути (/check в моем случае), добавьте раздел безопасности, как показано ниже:

   /check:
      post:
        ...
        x-google-backend:
           ....
           ....
        security:
           - firebase: []
        ....

См .: https://cloud.google.com/endpoints/docs/openapi/authenticating-users-firebase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...