API REST с аутентификацией и функциями Google Firebase с использованием токена на предъявителя - PullRequest
0 голосов
/ 05 марта 2020

Краткая справка: я программирую API, который считается «автономным», т. Е. Интерфейс не задействован. Доступ к API должен быть возможен напрямую, например, из Postman или Curl с токеном Bearer в заголовке аутентификации.

Я смотрел на Google Firebase и подумал, что он, вероятно, действительно подходит, потому что вся аутентификация уже встроена "и напрямую совместим с облачными функциями Google. Однако после выходных экспериментов я не могу понять, как реализовать REST API (с Google Cloud Functions), где пользователь может (в веб-интерфейсе) запросить токен API для взаимодействия с API. Я не хочу сам заниматься аутентификацией. Мне бы очень хотелось использовать аутентификацию Firebase для API.

Вот как должен выглядеть финальный процесс:

  1. Пользователь входит в веб-интерфейс со стандартной аутентификацией Firebase process.
  2. Пользователь нажимает на что-то вроде «Request API Key» и получает ключ, отображаемый в веб-интерфейсе (например, ab c ...). генерируется Firebase Authentication.
  3. Пользователь может отправлять запросы, например, с помощью curl на API, размещенный в облачных функциях Google, и ему просто нужно установить заголовок авторизации (Bearer ab c ...) и «валидацию». «этого токена обрабатывается Firebase Authentication.

Вот что я уже пытался сгенерировать токену:

admin.auth().createCustomToken(uid)
.then(function(customToken) {
    console.log(customToken);
})
.catch(function(error) {
    console.log('Error creating custom token:', error);
})

И затем установите токен, зарегистрированный на консоли в Postman. как токен на предъявителя, а затем используйте следующую функцию для проверки токена:

const authenticate = async (req, res, next) => {
if (!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) {
  res.status(403).send('Unauthorized');
  return;
}
const idToken = req.headers.authorization.split('Bearer ')[1];
try {

  const decodedIdToken = await admin.auth().verifyIdToken(idToken);
  req.user = decodedIdToken;
  next();
  return;
} catch(e) {
  console.log(e);
  res.status(403).send('Unauthorized');
  return;
}
}

Затем я получаю эту ошибку

message: 'verifyIdToken() expects an ID token, but was given a custom token. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.'

Я понимаю, что если бы я реализовал веб-интерфейс, я мог получить токен ID из devtools (?), но тогда токен действителен только 1 час ... Мне нужен токен, который действителен «бесконечно» и может быть сгенерирован и показан пользователю.

Кажется, я знаю, что мне нужно как-то использовать пользовательские токены, но я не могу понять, как заставить их работать ... (https://firebase.google.com/docs/auth/admin/create-custom-tokens).

Большое спасибо заранее всем!

Лучший Рик

1 Ответ

0 голосов
/ 05 марта 2020

Вы пытаетесь построить решение для управления API поверх Firebase и облачных функций. Пользовательские токены и токены ID не подходят для этой цели. Пользовательские токены предназначены только для использования в качестве учетных данных аутентификации пользователя на устройствах конечных пользователей, а идентификационные токены представляют собой успешный ответ аутентификации. Оба типа токенов истекают через час.

Если вам нужны долгоживущие управляемые ключи API, вам придется реализовать их самостоятельно. Там нет ничего встроенного в Firebase, что вы можете использовать из коробки. Однажды я реализовал такое решение в качестве прототипа, где я генерировал документ Firestore каждый раз, когда пользователь входил в систему и запрашивал ключ API. Затем я использовал идентификатор документа в качестве ключа API, который я мог проверить в облачной функции.

const apiKey = req.headers.authorization.split('Bearer ')[1];
const doc = await admin.firestore().collection('apiKeys').doc(apiKey).get();
if (doc.exists) {
  next();
}

Мне также пришлось реализовать некоторое локальное кэширование ключа API, чтобы сделать это эффективно.

Возможно, вам удастся избежать некоторых из этих действий, используя такое решение, как конечные точки Google Cloud (https://cloud.google.com/endpoints), хотя у меня нет личного опыта с этим. Наконец, посмотрите также на решения с открытым исходным кодом, такие как https://wso2.com/api-management/, которые позволяют настроить собственное управление ключами API и шлюз.

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