#node.js #passport.js #passport-google-oauth
#node.js #passport.js #паспорт-google-oauth
Вопрос:
Я использую стратегию Google oauth passport в своем приложении nodejs и не знаю, как правильно сохранить и обновить свой idToken, поэтому я могу использовать его для целей аутентификации при выполнении вызовов api для внешнего api. В настоящее время я записываю токен в текстовый файл и считываю его оттуда. Я чувствую, что это плохая идея, и мне просто нужны предложения о том, как сделать это более элегантным способом.
module.exports = function (passport) {
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: url },
async (accessToken, refreshToken, params, profile, done) => {
const idToken = params.id_token
fs.writeFile('token.txt', idToken, err => {
if (err) {
console.error(err)
return
}
//file written successfully
console.log("file written successfully")
})
}
Комментарии:
1. id_token необходим для автоматического создания access_token после 3600 мс, без интерактивного входа в систему (без пользователя). # 1 Это ваше требование? Это не является общим требованием. Общим требованием является наличие веб-страницы с кнопкой «google sing-in», обмен auth_code для получения access_token и использование access_token для использования любого API платформы Google. # 2 будете ли вы использовать только API Google или разрабатываете свои собственные API rest? # 3 Вы разрабатываете веб-приложение с использованием технологии рендеринга на стороне клиента или на стороне сервера?
2. @JRichardsz Да, у меня есть кнопка входа в Google, но в этом случае мне нужен id_token от Google для аутентификации во внешнем API, чтобы я мог получить токены на предъявителя, которые дадут мне разрешение на выполнение определенных действий во внешнем api. Веб-приложение использует рендеринг на стороне сервера.
3. Внешний API не является API Google. Это объяснит, что я пытаюсь реализовать, но с помощью passport-google-oauth: developers.google.com/identity/sign-in/web /…
4. @JRichardsz Если мой api — это мои собственные конечные точки, а не Google, я бы сгенерировал свой собственный access_token вместо того, чтобы использовать тот, который предоставлен Google, это правильно?
5. @крис, ты прав. Но в этом случае вам нужно будет использовать или разработать другую платформу для управления вашей аутентификацией и авторизацией. Подобные платформы называются IAM или oruaht2 OpenID service provider. Вот некоторые из них: auth0, okta, keycloack, hydra и т. Д
Ответ №1:
Как указано в другом постере, если вы используете токен исключительно для входа в систему, вам может вообще не понадобиться сохранять и обновлять токен ID.
Однако, если вы используете токен для доступа к API Google, и вам нужен доступ даже без присутствия пользователя, наиболее распространенный подход:
- Храните маркер доступа и маркер обновления в зашифрованном виде в базе данных, оба связаны с пользователем
- При использовании токена доступа проверьте, не выдает ли Google сообщение об ошибке, указывающее, что срок действия токена истек, используйте токен обновления, чтобы получить новый токен доступа, и сохраните этот новый токен доступа в своей базе данных (опять же, в зашифрованном виде)
В случае с Google обязательно передайте access_type=offline
параметр для получения токена обновления. Кроме того, если это пользователь, которого вы ранее авторизовали, вам нужно будет пройти prompt=consent
, так как в противном случае Google не будет выдавать токен обновления.
Альтернативой реализации всего вышеперечисленного является использование управляемой службы OAuth, такой как Xkit, где я работаю. Он обрабатывает хранение, шифрование и обновление токенов, а также все нюансы, зависящие от поставщика. Опять же, полезно только в тех случаях, когда вы используете токены для доступа к API (а не для входа в систему), но следует рассмотреть еще один вариант.
Комментарии:
1. Я пытался реализовать ваше предложение, но работает только некоторое время и перестает работать. Я должен удалить пользователя из базы данных, прежде чем он снова начнет работать. Вот оно: gist.github.com/dayoadisa/31507f0ba8812abf76e960f3b8d12dfb
2. gist.github.com/dayoadisa /… этот параметр выглядит неправильно. Проверьте случай верблюда против случая змеи по обоим параметрам.
3. req.user.refreshToken — это то, что у меня есть в базе данных. Проблема, с которой я сталкиваюсь, заключается в том, что он обновляет токены после первого истечения срока действия, но при попытке сделать это во второй раз, когда срок действия токена истек, он не будет работать. Почему это работает в первый раз, а не после