错误:运行时:扩展时间〜请求:请求URL是用node.js和Express的Google Oauth空的,无法获得身份验证
我试图让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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
就像您提到的,URL是错误的。
使用
http:// localhost:3000/订阅者/google/callback
(OR)Like you mentioned, url is wrong.
Use
http://localhost:3000/subscribers/google/callback
(or)