错误:运行时:扩展时间〜请求:请求URL是用node.js和Express的Google Oauth空的,无法获得身份验证

发布于 2025-01-31 18:12:50 字数 4160 浏览 4 评论 0原文

我试图让Google Oauth与我的节点JS Backend一起使用,我正在使用Passport JS与Google策略以及Mongoose查找或创建软件包来查找或创建用户。

当请求与Postman的访问令牌时,我可以通过Google浏览器弹出窗口完成签名。

回调URL是:http:// localhost:3000/subscirecters/google/callback

auth url is:http:// localhost:3000/subscribers/google

剩下的细节将由Passport传递。

我的订户路由中的顶部样板代码:

const express = require("express");
const router = express.Router();
const Subscriber = require("../models/subscriber");
const passport = require("passport");
const session = require("express-session");
const Order = require("../models/order");
const GoogleStrategy = require('passport-google-oauth20').Strategy;


router.use(session({
    secret: "foodsecrets",
    resave: false,
    saveUninitialized: false
}));

router.use(passport.initialize());
router.use(passport.session());
passport.use(Subscriber.createStrategy());
passport.serializeUser(Subscriber.serializeUser());
passport.deserializeUser(Subscriber.deserializeUser());



passport.use(new GoogleStrategy({
        clientID: "330178790432-ro0cr35k37f7kq4ln4pdq6dqdpqqtri6.apps.googleusercontent.com",
        clientSecret: "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",
        callbackURL: "http://localhost:3000/subscribers/google/callback",
        userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
    },
    function (accessToken, refreshToken, profile, cb) {
        Subscriber.findOrCreate({
            googleId: profile.id
        }, function (err, user) {
            return cb(err, user);
        });
    }
));

初始auth和回调的路由:

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

router.get(
    "/google/callback",
    passport.authenticate("google", {
        successRedirect: "http://localhost:3001",
        failureRedirect: "/login/failed",
    })
);

订户架构:

const mongoose = require("mongoose")
const passportLocalMongoose = require("passport-local-mongoose");
const findOrCreate = require('mongoose-findorcreate')




const cartSchema = new mongoose.Schema({
    name: String,
    price: Number,
    description: String
})

const favouritesSchema = new mongoose.Schema({
    favouritemeals: {
        type: Array

    },
    favouriteresturants: {
        type: Array

    }
})

const pendingItemsSchema = new mongoose.Schema({
    name: String,
    price: Number,
    description: String

})

const pendingOrderSchema = new mongoose.Schema({
     userID: {
             type: String,
             required: true
         },
         total: {
             type: Number,
             required: true
         },
         items: [pendingItemsSchema],
         removeItem: {
             type: String
         },
         orderData: {
             type: Date,
             required: true,
             default: Date.now
         },
         confirmed: {
             type: Boolean,
             required: true
         }
})

const subscriberSchema = new mongoose.Schema({
    
    username: {
        type: String,
        required: true
    },
    email: {
        type: String,
    },
    subscribeData: {
        type: Date,
        required: true,
        default: Date.now
    },
    orderHistory: {
        type: Array,
    },
    favourites: {
        favouritesSchema
    },
    cart: [cartSchema],
    login: {
        type: String,

    },
    pendingOrder: [pendingOrderSchema]
})



subscriberSchema.plugin(passportLocalMongoose)
subscriberSchema.plugin(findOrCreate)

module.exports = mongoose.model("subscriber", subscriberSchema)

登录到访问令牌请求时

In

Error: runtime:extensions~request: request url is empty

ofsess

POST
Error: runtime:extensions~request: request url is empty
Request Headers
Content-Type: application/x-www-form-urlencoded
Authorization: Basic Og==
Request Body
grant_type: "authorization_code"
code: "4/0AX4XfWjomz86Qs18ShaqLeJmQO13nTOzaz92dONTQgRUNQsuFj6ipIS6D5KFgjiWQtFkVg"
redirect_uri: "http://localhost:3000/subscribers/google/callback"
client_id: ""

当我从Postman i Mosess Imess 认为我的回调路线有问题,但我不确定。这是我第一次设置Oauth,因此无知,任何帮助都将不胜感激。

I am trying to get Google OAuth to work with my node JS backend, I am using Passport JS with the google Strategy as well as the mongoose find or create package to find or create the user.

I am able to complete signin with the google browser popup when requesting an access token with postman.

callback URL is: http://localhost:3000/subscribers/google/callback

Auth URL is: http://localhost:3000/subscribers/google

The remaining detail is being passed in by passport.

Top Boilerplate code in my Subscribers route:

const express = require("express");
const router = express.Router();
const Subscriber = require("../models/subscriber");
const passport = require("passport");
const session = require("express-session");
const Order = require("../models/order");
const GoogleStrategy = require('passport-google-oauth20').Strategy;


router.use(session({
    secret: "foodsecrets",
    resave: false,
    saveUninitialized: false
}));

router.use(passport.initialize());
router.use(passport.session());
passport.use(Subscriber.createStrategy());
passport.serializeUser(Subscriber.serializeUser());
passport.deserializeUser(Subscriber.deserializeUser());



passport.use(new GoogleStrategy({
        clientID: "330178790432-ro0cr35k37f7kq4ln4pdq6dqdpqqtri6.apps.googleusercontent.com",
        clientSecret: "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",
        callbackURL: "http://localhost:3000/subscribers/google/callback",
        userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
    },
    function (accessToken, refreshToken, profile, cb) {
        Subscriber.findOrCreate({
            googleId: profile.id
        }, function (err, user) {
            return cb(err, user);
        });
    }
));

Routes for initial Auth and Callback:

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

router.get(
    "/google/callback",
    passport.authenticate("google", {
        successRedirect: "http://localhost:3001",
        failureRedirect: "/login/failed",
    })
);

Subscriber Schema:

const mongoose = require("mongoose")
const passportLocalMongoose = require("passport-local-mongoose");
const findOrCreate = require('mongoose-findorcreate')




const cartSchema = new mongoose.Schema({
    name: String,
    price: Number,
    description: String
})

const favouritesSchema = new mongoose.Schema({
    favouritemeals: {
        type: Array

    },
    favouriteresturants: {
        type: Array

    }
})

const pendingItemsSchema = new mongoose.Schema({
    name: String,
    price: Number,
    description: String

})

const pendingOrderSchema = new mongoose.Schema({
     userID: {
             type: String,
             required: true
         },
         total: {
             type: Number,
             required: true
         },
         items: [pendingItemsSchema],
         removeItem: {
             type: String
         },
         orderData: {
             type: Date,
             required: true,
             default: Date.now
         },
         confirmed: {
             type: Boolean,
             required: true
         }
})

const subscriberSchema = new mongoose.Schema({
    
    username: {
        type: String,
        required: true
    },
    email: {
        type: String,
    },
    subscribeData: {
        type: Date,
        required: true,
        default: Date.now
    },
    orderHistory: {
        type: Array,
    },
    favourites: {
        favouritesSchema
    },
    cart: [cartSchema],
    login: {
        type: String,

    },
    pendingOrder: [pendingOrderSchema]
})



subscriberSchema.plugin(passportLocalMongoose)
subscriberSchema.plugin(findOrCreate)

module.exports = mongoose.model("subscriber", subscriberSchema)

when I send the access token request from postman I login sucessfully and recieve the following error as well as the following detail

Error message in console:

Error: runtime:extensions~request: request url is empty

Request Detail:

POST
Error: runtime:extensions~request: request url is empty
Request Headers
Content-Type: application/x-www-form-urlencoded
Authorization: Basic Og==
Request Body
grant_type: "authorization_code"
code: "4/0AX4XfWjomz86Qs18ShaqLeJmQO13nTOzaz92dONTQgRUNQsuFj6ipIS6D5KFgjiWQtFkVg"
redirect_uri: "http://localhost:3000/subscribers/google/callback"
client_id: ""

I think there is something wrong with my callback route but I'm not really sure. This is my first time setting OAuth up so a bit clueless, any help would be massively appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

墨离汐 2025-02-07 18:12:50

就像您提到的,URL是错误的。

使用http:// localhost:3000/订阅者/google/callback(OR)

passport.use(new GoogleStrategy({
        clientID: "330178790432-ro0cr35k37f7kq4ln4pdq6dqdpqqtri6.apps.googleusercontent.com",
        clientSecret: "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",
        callbackURL: "http://localhost:3000/subscribers/google/callback", // fix this url
        userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
    },

Like you mentioned, url is wrong.

Use http://localhost:3000/subscribers/google/callback (or)

passport.use(new GoogleStrategy({
        clientID: "330178790432-ro0cr35k37f7kq4ln4pdq6dqdpqqtri6.apps.googleusercontent.com",
        clientSecret: "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",
        callbackURL: "http://localhost:3000/subscribers/google/callback", // fix this url
        userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
    },
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文