Express - Паспорт JS - Google OAuth2.0 - Как заставить сервер запрашивать учетную запись Gmail при каждом входе в систему? - PullRequest
0 голосов
/ 10 апреля 2020

Я работаю над этим приложением с Express + React и использую Passport JS с его стратегией Google OAuth2.0 для аутентификации.

Моя проблема в том, что при первом входе в систему для данного браузера он запрашивает у меня учетную запись Google, с которой я хочу войти, но после этого он этого не делает. Даже после того, как я вышел из системы, очистив куки в Express.

Может кто-нибудь помочь мне разобраться?

Я поставлю свой внутренний код ниже.

passport-setup. js

function isEmpty(obj) {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) return false;
  }
  return true;
}

passport.serializeUser((player, done) => {
  let cookieData = {
    p_id: player.p_id,
    t_id: player.t_id,
  };
  console.log("serialize : ", cookieData);
  done(null, cookieData);
});

passport.deserializeUser(async (cookieData, done) => {
  if (cookieData.t_id === null) {
    let err, result;
    [err, result] = await to(
      (await db).query("SELECT * FROM players where p_id = ?", [
        cookieData.p_id,
      ])
    );
    if (err) {
      return done(err);
    } else {
      let player = {
        p_id: result[0].p_id,
        p_name: result[0].p_name,
        email: result[0].email,
        t_id: result[0].t_id,
      };
      return done(null, player);
    }
  } else {
    let err, result;
    [err, result] = await to(
      (
        await db
      ).query(
        "SELECT * FROM players INNER JOIN teams USING(t_id) WHERE p_id = ?",
        [cookieData.p_id]
      )
    );
    if (err) {
      return done(err);
    } else {
      let player = {
        p_id: result[0].p_id,
        p_name: result[0].p_name,
        email: result[0].email,
        t_id: result[0].t_id,
        t_name: result[0].t_name,
        score: result[0].score,
        multiplier: result[0].multiplier,
        time_reached_score: result[0].time_reached_score,
        wrong_allowed: result[0].wrong_allowed,
        powers: result[0].powers,
      };
      return done(null, player);
    }
  }
});

passport.use(
  new GoogleStrategy(
    {
      callbackURL: "/auth/google/cb",
      clientID: keys.google.clientID,
      clientSecret: keys.google.clientSecret,
    },
    async (accessToken, refreshToken, profile, done) => {
      //TODO: get/insert user
      let err, result;
      [err, result] = await to(
        (await db).query("SELECT * FROM players WHERE google_id = ?", [
          profile.id,
        ])
      );

      if (err) {
        return done(err);
      }
      if (isEmpty(result)) {
        let err1, result1;
        [err1, result1] = await to(
          (
            await db
          ).query(
            "INSERT INTO players (p_name, email, google_id) VALUES (?, ?, ?)",
            [profile.displayName, profile.emails[0].value, profile.id]
          )
        );
        if (err1) {
          return done(err1);
        } else {
          // Since result doesnt return details
          let player = {
            p_id: result1.insertId,
            p_name: profile.displayName,
            email: profile.emails[0].value,
            google_id: profile.id,
            t_id: null,
          };
          console.log("new player: ", player);
          return done(null, player);
        }
      } else {
        let player = {
          p_id: result[0].p_id,
          p_name: result[0].p_name,
          email: result[0].email,
          google_id: result[0].google_id,
          t_id: result[0].t_id,
        };
        console.log("player: ", player);
        return done(null, player);
      }
    }
  )
);

auth. js

router.get("/logout", (req, res) => {
  req.logout(); // Removes user from cookie
  res.sendSuccess({}, "Logged out");
});

router.get(
  "/google",
  passport.authenticate("google", {
    scope: ["profile", "email"],
  })
);

router.get("/google/cb", passport.authenticate("google"), (req, res) => {
  if (req.user) {
    res.redirect("http://localhost:3000/");
  } else {
    res.redirect("http://localhost:3000/login");
  }
});

приложение. js

require("dotenv").config();

const express = require("express");
const bodyParser = require("body-parser");
const cookieSession = require("cookie-session");
const passport = require("passport");
const cors = require("cors");

const app = express();
const server = require("http").Server(app);

const response = require("./utils/response");
const authRouter = require("./routes/auth");
const router = require("./routes/index");
const keys = require("./config/keys");

const port = process.env.PORT || 5000;

require("./config/passport-setup");

app.use(
  cookieSession({
    maxAge: 2 * 60 * 60 * 1000,
    keys: [keys.session.cookieKey],
  })
);

app.use(passport.initialize());
app.use(passport.session());

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use("*", function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://localhost:3000");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  res.header("Access-Control-Allow-Credentials", true);
  next();
});

app.use(
  cors({
    origin: function (origin, callback) {
      return callback(null, true);
    },
    optionsSuccessStatus: 200,
    credentials: true,
  })
);

app.use(response);
app.use("/auth", authRouter);
app.use("/api", router);

server.listen(port, (err) => {
  console.log(err || `Listening on ${port}`);
});
...