Я работаю над этим приложением с 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}`);
});