node.js - cors 问题与 passport.js google oauth 策略

标签 node.js reactjs passport.js

我有这样的设置:

-backend
    -model
        --User.js
    -routes
        --auth.js
    -database
        --connection.js
    -passport
        --passport.js
    --server.js
-client
     -react folders / files
     ...

在我的 server.js 中:

const express = require("express");
const cookieSession = require("cookie-session");
const passport = require("passport");

const { authRoutes } = require("./routes/auth");

require("./model/User");
require("./services/passport");
require("./services/mongoConnect");

const app = express();

app.use(
    cookieSession({
        maxAge: "30 * 24 * 60 * 60 * 1000",
        keys: "MY-KEY",
    })
);
app.use(
    cors({
        origin: true,
        methods: "GET, POST, PATCH, DELETE, PUT",
        allowedHeaders: "Content-Type, Authorization",
    })
);

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

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

app.use("/", authRoutes);

app.listen(PORT);

在我的路由器中的 auth.js 文件中

const passport = require("passport");
const router = require("express").Router();

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

router.get("/auth/google/callback", passport.authenticate("google"));

router.get("/api/logout", (req, res) => {
    req.logout();
    res.send(req.user);
});

router.get("/api/current_user", (req, res) => {
    res.send(req.user);
});

module.exports = {
    authRoutes: router,
};

我有内部 passport.js 文件

const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth20").Strategy;
const mongoose = require("mongoose");

const User = mongoose.model("users");

passport.use(
    new GoogleStrategy(
        {
            clientID: "MY-ID",
            clientSecret: "MY-SECRET",
            callbackURL: "/auth/google/callback",
            proxy: true,
        },
        (accessToken, refreshToken, profile, done) => {
            User.findOne({ googleId: profile.id }).then((existingUser) => {
                if (existingUser) {
                    done(null, existingUser);
                } else {
                    new User({
                        googleId: profile.id,
                    })
                        .save()
                        .then((newUser) => {
                            done(null, newUser);
                        });
                }
            });
        }
    )
);

passport.serializeUser((user, done) => {
    done(null, user._id);
});

passport.deserializeUser((id, done) => {
    User.findById(id).then((user) => {
        done(null, user);
    });
});

我的前端包含一个点击我的 auth/google 路由的按钮。但是,它会在控制台中记录一个 cors 问题错误。

(redirected from 'http://localhost:3000/auth/google') from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

谁知道我该如何解决这个问题?在 mu google 控制台中,我将重定向 url 设置为“http://localhost:3000/auth/google/callback”

最佳答案

您在后端错误配置了 CORS。

首先,当涉及到方法时,你使用了错误的语法——当你列出它们时不应该有空格(我不知道他们是如何解析字符串的,但你应该坚持与文件 - 根据文档,您可以将方法指定为字符串:'GET,PUT,POST' 或列表:['GET', 'PUT', 'POST'].

其次,您在 methods 中缺少 OPTIONS HTTP 方法,浏览器在预检请求中使用该方法来测试服务器的 CORS 配置。

第三,你确定指定的headers吗?

如果您不确定自己在做什么并在每次请求之前全局应用 cors,最简单的选择是完全删除 CORS options 配置。

app.use(cors());

或者仅到您希望允许 CORS 的特定路径。

app.get("/somepath", cors(), (req, res) => {...

关于node.js - cors 问题与 passport.js google oauth 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63289585/

相关文章:

node.js - 在 Linux 终端中看不到 console.log()

javascript - 如果我们已经有了dispatch作为props,为什么还需要mapDispatchToProps呢?

javascript - 无法使用 Express 和 MongoDB/Mongoose 设置 Passport - 示例代码?

node.js - 使用 OOP 扩展 Node.js 模块

javascript - fetch() 多次循环后调用函数

node.js - Passportjs - 如何在 401 情况下访问状态消息

node.js - 使用不同的轨道关键字重新启动nodejs ntwitter twitter流

javascript - 没有导出成员 'Headers' 和 RequestOptions

javascript - 如何在嵌入中调用 .username 属性? (不和谐.js)

javascript - React 将对象插入数组,始终插入最后一个数组