ОК, вот как я это сделал.
В основном вы реализуете базовую концепцию, описанную в документации passport.js, и добавляете отдельную конечную точку для доступа к пользовательской информации.Вот почему я опишу, где он начинает немного различаться
Шаг 1. Аутентификация пользователя на шлюзе
Как описано в документации к passport.js.Микросервис аутентификации нуждается в следующем обратном вызове (маршрутизатор здесь уже обслуживается в / auth)
router.get("/provider/callback", passport.authenticate("provider", {
failureRedirect: "https://your-frontent-app.com/login",
}), (req, res) => {
res.redirect("https://your-frontend-app.com");
});
Когда вы вернетесь в свое веб-приложение, вы увидите, что Session-Cookie успешно сохранен.
Шаг 2: Получить информацию о пользователе из конечной точки
Теперь нам нужна вторая конечная точка / auth / userinfo в наших маршрутах.
router.get('/userinfo', (req, res) => {
if(!req.session) return res.status(401).send();
if(!req.session.passport) return res.status(401).send();
if(!req.session.passport.user) return res.status(401).send();
return res.json(req.session.passport.user).status(200).send();
});
Не оченьдовольно этот блок с 3 если, но мне случилось, что все эти комбинации могут быть неопределенными
Теперь, сессионный cookie, сохраненный в нашем браузере, мы можем вызвать эту конечную точку из нашего внешнего интерфейса с учетными данными (Для этого я буду использовать axios)
axios.get('https://your-authenticator.com/auth/userinfo', {withCredentials: true})
.then(res => {
//do stuff with res.data
});
Теперь есть еще одна вещь, которую стоит отметить.Если вы хотите использовать учетные данные для вызова этого API, установка заголовка Access-Control-Allow-Origin в * не будет работать.Вам нужно будет использовать конкретный хост, с которого вы будете звонить.Также вам нужно будет разрешить учетные данные в заголовке.Итак, вернувшись в основное приложение Express, убедитесь, что вы используете заголовки, такие как
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "https://your-frontend-app.com");
res.header("Access-Control-Allow-Credentials", "true");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Auth, Authentication, Authorization, Credentials");
next();
});