У меня есть маршрут, который предназначен для аутентификации пользователя с использованием стратегии паспорта google oauth, (/auth/google) Я также хочу передать дополнительные данные в виде запроса в URL-адресе этого маршрута (/auth/google?someParam=SOME_PARAM), эти данные я хочу добавить в req.user к тому времени, когда я получу его из Google в (/auth/google/callback). Проблема в том, что у меня есть доступ к этому запросу через /auth/google, но Google перенаправит меня на /auth/google/callback, который больше не имеет доступа к этим данным.

Примечание. Из-за ограничений дизайна я не могу использовать внешний источник в качестве базы данных.

Passport-google docs

КОД:

// auth.js 

router.get(
  "/",
  (req, res, next) => {
    let siteName = req.query.siteName;
    let pageName = req.query.pageName;
    console.log("siteName", siteName);
    return next();
  },
  passport.authenticate("google", {
    scope: ["https://www.googleapis.com/auth/plus.login"]
  })
);

module.exports = router;




// authCb.js

router.get(
  "/",
  passport.authenticate("google", {
    scope: ["https://www.googleapis.com/auth/plus.login"],
    failureRedirect: "/"
  }),
  (req, res) => {
    console.log(req.user);
    res.send(req.user);
  }
);

module.exports = router;





// app.js

app.use("/auth/google", auth);
app.use("/auth/google/callback", authCb);
0
obiwankenoobi 25 Сен 2018 в 12:05

2 ответа

Лучший ответ

Вы должны сохранить свои параметры в сеансе перед отправкой запроса аутентификации в Google. Затем, после перенаправления, верните свои параметры из сеанса.

// auth.js 
router.get(
  "/",
  (req, res, next) => {
    req.session.lastQuery = req.query;
    return next();
  },
  passport.authenticate("google", {
    scope: ["https://www.googleapis.com/auth/plus.login"]
  })
);

module.exports = router;

// authCb.js

router.get(
  "/",
  passport.authenticate("google", {
    scope: ["https://www.googleapis.com/auth/plus.login"],
    failureRedirect: "/"
  }),
  (req, res) => {
    const { lastQuery } = req.session;
    console.log(lastQuery);
  }
);

module.exports = router;
1
Martial 25 Сен 2018 в 09:41

Вам следует обратиться к документации Google. Вы можете использовать параметр "state" для передачи любых данных, которые вы хотите вернуть, когда пользователь вернется на ваш сайт. Это основное использование этого параметра. Подробности можно увидеть здесь.

0
nvnagr 26 Сен 2018 в 00:11