Я реализовал локальный вход, а также вход в Google с помощью паспорта.js в веб-приложении mern. Локальная аутентификация работает нормально с внешним интерфейсом, но я получаю ошибки при использовании стратегии Google.
Ошибка:
Доступ к XMLHttpRequest по адресу https: //accounts.google.com/o/oauth2/v2/auth? ......... (перенаправлен с http: // localhost: 5000 / auth / google) from origin 'http: // localhost: 3000' заблокирован политикой CORS: на запрошенном ресурсе отсутствует заголовок 'Access-Control-Allow-Origin'.
Ошибка: ошибка сети
at createError (createError.js: 16)
в XMLHttpRequest.handleError (xhr.js: 84)
Проблема, отображаемая консолью:
Укажите, предназначен ли файл cookie для установки в межсайтовом контексте, указав его атрибут SameSite.
Укажите, следует ли отправлять файл cookie в межсайтовом запросе, указав его атрибут SameSite
Я протестировал стратегию Google с помощью POSTMAN, и она работала нормально, но при запросе из моего интерфейса, похоже, возникла какая-то проблема.
server.js
require("dotenv").config();
const express=require("express");
const cors=require("cors");
const mongoose=require("mongoose");
const session=require("express-session");
const passport=require("passport");
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const errorController=require("./controllers/errorController")
const app=express();
const port = process.env.PORT || 5000;
app.use(
cors({
origin: "http://localhost:3000", // <-- location of the react app were connecting to
credentials: true,
})
);
app.use(express.static("public"));
app.use(express.urlencoded({extended: true}));
app.use(express.json());
app.use(session({
secret:process.env.SECRET,
resave:false,
saveUninitialized:false,
}));
app.use(passport.initialize());
app.use(passport.session());
const User=require("./models/user.model");
passport.use(User.createStrategy());
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use(new GoogleStrategy({
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: "http://localhost:5000/auth/google/keeper"
},
function(accessToken, refreshToken, profile, cb) {
console.info(profile);
User.findOrCreate({ googleId: profile.id }, function (err, user) {
return cb(err, user);
});
}
));
mongoose.connect(process.env.MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify:false, useCreateIndex:true});
const connection = mongoose.connection;
connection.once('open', () => {
console.info("MongoDB database connection established successfully");
});
const loginRouter=require("./routes/login");
const registerRouter=require("./routes/register");
const logoutRouter=require("./routes/logout");
const authRouter=require("./routes/auth");
app.use("/login", loginRouter);
app.use("/register", registerRouter);
app.use("/logout", logoutRouter);
app.use("/auth/google", authRouter);
app.use(errorController);
app.listen(port, function(){
console.info("server started on port 5000");
});
auth.js (обрабатывает маршруты, связанные с входом в Google)
const router=require("express").Router();
const passport=require("passport");
router.get("/", passport.authenticate("google", { scope: ["profile"] }));
router.get("/keeper",
passport.authenticate("google", { failureRedirect: "/login" }),
function(req, res) {
// Successful authentication, redirect home.
res.redirect("/");
});
module.exports=router;
Запрос Axios из интерфейса
function googleLogin(event){
Axios({
method: "GET",
withCredentials: true,
url: "http://localhost:5000/auth/google",
})
.then(function(res){
console.info(res);
})
.catch(function(err){
console.info(err);
})
event.preventDefault();
}
кнопка, запускающая запрос
<button className = "btn btn-danger" onClick = {googleLogin}>Sign in with Google</button>
@AmaranadhMeda Я добавил значение origin в промежуточном программном обеспечении cors в качестве URL-адреса внешнего интерфейса. Взгляните на файл server.js. Я не могу пометить его как *, потому что у меня withCredentials как true в моих запросах axios. Я застрял в этом вопросе уже 3 дня: '(
Добавьте конфигурацию cors непосредственно перед / login route configuratio.





Добавьте значение Access-Control-Allow-Origin в * или свой URL-адрес FE. Тогда все заработает.