Краткая справка: я программирую API, который считается «автономным», т. Е. Интерфейс не задействован. Доступ к API должен быть возможен напрямую, например, из Postman или Curl с токеном Bearer в заголовке аутентификации.
Я смотрел на Google Firebase и подумал, что он, вероятно, действительно подходит, потому что вся аутентификация уже встроена "и напрямую совместим с облачными функциями Google. Однако после выходных экспериментов я не могу понять, как реализовать REST API (с Google Cloud Functions), где пользователь может (в веб-интерфейсе) запросить токен API для взаимодействия с API. Я не хочу сам заниматься аутентификацией. Мне бы очень хотелось использовать аутентификацию Firebase для API.
Вот как должен выглядеть финальный процесс:
- Пользователь входит в веб-интерфейс со стандартной аутентификацией Firebase process.
- Пользователь нажимает на что-то вроде «Request API Key» и получает ключ, отображаемый в веб-интерфейсе (например, ab c ...). генерируется Firebase Authentication.
- Пользователь может отправлять запросы, например, с помощью 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).
Большое спасибо заранее всем!
Лучший Рик