Google OAuth2 不适用于移动设备
Posted
技术标签:
【中文标题】Google OAuth2 不适用于移动设备【英文标题】:Google OAuth2 is not working on mobile 【发布时间】:2018-09-13 02:25:50 【问题描述】:所以最近我遇到了一个问题,当我尝试使用移动设备上的 google oauth2 进行身份验证时会发生这种情况,但是当我尝试通过计算机进行身份验证时,它工作正常。我在 node/express 项目中将它与 passportjs 一起使用。
项目链接:https://rhubarb-tart-18821.herokuapp.com/
你们可以在这里看到代码: https://ide.c9.io/saijax/www
只是整个身份验证太大了,我不能把所有东西都放在这里......
编辑:
这里是一些主要文件
passport.js
const GoogleStrategy = require("passport-google-oauth2")
.Strategy;
const mongoose = require("mongoose");
const keys = require("./keys");
module.exports = (passport) =>
passport.use(
new GoogleStrategy(
clientID: keys.googleClientID,
clientSecret: keys.googleClientSecret,
callbackURL: "/auth/google/callback",
proxy: true
, (accessToken, refreshToken, profile, done) =>
const image = profile.photos[0].value.substring(0, profile.photos[0].value.indexOf("?"));
const newUser =
googleID: profile.id,
email: profile.emails[0].value,
firstName: profile.name.givenName,
lastName: profile.name.familyName,
image: image
// CHECK FOR USER
User.findOne(
googleID: profile.id
).then(user =>
if(user)
done(null, user);
else
// CREATE USER
new User(newUser)
.save()
.then(user => done(null,user));
)
)
);
passport.serializeUser((user, done) =>
done(null, user.id);
);
passport.deserializeUser((id, done) =>
User.findById(id)
.then(user => done(null, user));
);
auth.js
const express = require("express");
const passport = require("passport");
const router = express.Router();
router.get("/google", passport.authenticate("google",
scope: [
"profile",
"email"
]
));
router.get("/google/callback", passport.authenticate("google",
failureRedirect: "/"
), (req, res) =>
req.flash("success_msg", "Successfully Logged In");
res.redirect("/dashboard");
);
router.get("/verify", (req, res) =>
if(req.user)
console.log(req.user);
else
console.log("Not auth");
);
router.get('/logout', (req, res) =>
req.logout();
req.flash("success_msg", "Successfully Logged Out");
res.redirect('/');
);
module.exports = router;
app.js
// SETUP
const express = require("express");
const mongoose = require("mongoose");
const passport = require("passport");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const exphbs = require("express-handlebars");
const bodyParser = require("body-parser");
const methodOverride = require("method-override");
const flash = require("connect-flash");
// LOAD GOOGLE AND MONGO KEYS
const keys = require("./config/keys");
// LOAD MODELS
require("./models/story");
require("./models/user");
// PASSPORT CONFIG
require("./config/passport")(passport);
// LOAD ROUTES
const auth = require("./routes/auth");
const index = require("./routes/index");
const stories = require("./routes/stories");
// HANLEBARS HELPERS
const
truncate,
stripTags,
formatDate,
select,
editIcon
= require("./helpers/hbs");
// MONGOOSE CONNECT
mongoose.connect(keys.mongoURI)
.then(() =>
console.log("MongoDB Connected...");
).catch(err => console.log(err));
// USE APP
const app = express();
// CSS CONFIG
app.use(express.static(__dirname + "/public"));
// VIEW ENGINE
app.engine("handlebars", exphbs(
helpers:
truncate: truncate,
stripTags: stripTags,
formatDate: formatDate,
select: select,
editIcon: editIcon
,
defaultLayout: "main"
));
app.set("view engine", "handlebars");
// BODY PARSER
app.use(bodyParser.json());
app.use(bodyParser.urlencoded(extended: true));
// METHOD OVERRIDE
app.use(methodOverride("_method"));
// FLASH
app.use(flash());
// COOKIE PARSER
app.use(cookieParser());
// SESSION MIDDLEWARE
app.use(session(
secret: "KAPPA",
resave: false,
saveUninitialized: false
));
// PASSPORT MIDDLEWARE
app.use(passport.initialize());
app.use(passport.session());
// SET GLOBAL VARS
app.use((req, res, next) =>
res.locals.user = req.user || null;
res.locals.success_msg = req.flash("success_msg");
res.locals.error_msg = req.flash("error_msg");
next();
);
// ROUTES
app.use("/", index);
app.use("/auth", auth);
app.use("/stories", stories);
【问题讨论】:
你不必把所有的代码都放在这里,但你至少可以把相关的东西复制到这里(比如快速路线配置,也许是护照策略),并添加你使用的步骤在台式机上可以工作,但不能在移动设备上工作,以及您在哪一步失败。此外,任何错误消息(或缺少错误消息),在一种情况下执行 api 端点,然后在另一种情况下,类似的事情。如果您帮助我们帮助您,您将更有可能收到有用的答案。 @Zlatko 感谢重播,好吧,我试着在这里发布代码,只是当我尝试从我的计算机进行身份验证时,我得到字面上 0 错误,但我只得到一个说我的凭据不正确,但它们是正确的,我检查了百万次。 此外,您的 Cloud 9 链接要求进行身份验证。许多人没有帐户,而且很多人不会只针对 SO 上的一个问题开设一个帐户。如前所述,应该少用外部链接,并且大部分问题(几乎所有需要重建问题)都应该在您的问题中。 好的,谢谢,正在处理中 我也会尝试的,但是现在我发现一件事可能只是 heroku 问题,因为当我尝试通过 c9 url 进入我的页面时,两者都有效移动和桌面。奇怪 【参考方案1】:更新:嗯,我不知道这是不是愚蠢的错误,但似乎手机无法阅读
callbackURL: "/auth/google/callback"
相反,我用
更改了以下行callbackURL: keys.callback + "/auth/google/callback"
keys.callback 是我的应用程序的 url(来自 c9/heroku)...现在它可以完美运行了!
【讨论】:
以上是关于Google OAuth2 不适用于移动设备的主要内容,如果未能解决你的问题,请参考以下文章