我在其中一个应用程序中使用google plus API。在我的本地存储库中,它运行正常,但是在Heroku上,它抛出此错误: 错误:redirect_uri_mismatch
请求http://discuss-my-anime.herokuapp.com/auth/google/redirect中的重定向URI与为OAuth客户端授权的重定向URI不匹配。
我的google plus API凭据如下: Google plus API credentials
我正在使用护照包进行身份验证,我的护照设置代码如下:
const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth20");
const keys = require("./keys");
const User = require("../models/user-model");
passport.serializeUser((user, done)=>{
done(null, user.id);
});
passport.deserializeUser((id, done)=>{
User.findById(id).then((user)=>{
done(null, user);
});
});
passport.use(
new GoogleStrategy({
//options for google strategy
callbackURL: "/auth/google/redirect",
clientID: keys.google.clientID,
clientSecret: keys.google.clientSecret
}, (accessToken, refreshToken, profile, done)=>{
//check if user already exists
User.findOne({googleId: profile.id}).then((currentUser)=>{
if(currentUser){
//already have a user
console.log("user is: " + currentUser);
done(null, currentUser);
}
else{
//creating new user
new User({
username: profile.displayName,
googleId: profile.id,
thumbnail: profile._json.picture
}).save().then((newUser)=>{
console.log("new user created: " + newUser);
done(null, newUser);
});
}
});
})
);
答案 0 :(得分:0)
出现此错误的原因是在此处使用相对路径:
callbackURL: "/auth/google/redirect"
由于开发环境和产品环境的网址不同,因此我们使用相对路径。最后,googleStrategy将在此处确定要放置的域。那就是我们得到不匹配网址的地方。在开发环境中,它附加在正确的域上,但是在生产环境中,它做错了事。
为了确保来自我们浏览器的流量被路由到正确的服务器,Heroku使用代理或负载均衡器。 googleStrategy在生产中错误地计算该域的原因是,默认情况下,该策略假定,如果我们来自浏览器的请求曾经通过任何类型的代理,则该请求不应再为https,因为它固有地不希望信任通过代理请求。对于我们来说,我们完全信任heroku代理,就像我们的应用程序托管在heroku上一样。
如果将以下属性放在GoogleStrategy初始配置对象中
proxy: true
这对GoogleStrategy说,如果我们的请求通过任何代理运行,则您可以信任它。