为什么我的OAuth2身份验证在heroku上出现redirect_uri_mismatch错误?

时间:2019-06-29 15:47:05

标签: node.js oauth-2.0 google-plus

我在其中一个应用程序中使用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);
				});
			}
		});
	})
);

1 个答案:

答案 0 :(得分:0)

出现此错误的原因是在此处使用相对路径:

callbackURL: "/auth/google/redirect"

由于开发环境和产品环境的网址不同,因此我们使用相对路径。最后,googleStrategy将在此处确定要放置的域。那就是我们得到不匹配网址的地方。在开发环境中,它附加在正确的域上,但是在生产环境中,它做错了事。

为了确保来自我们浏览器的流量被路由到正确的服务器,Heroku使用代理或负载均衡器。 googleStrategy在生产中错误地计算该域的原因是,默认情况下,该策略假定,如果我们来自浏览器的请求曾经通过任何类型的代理,则该请求不应再为https,因为它固有地不希望信任通过代理请求。对于我们来说,我们完全信任heroku代理,就像我们的应用程序托管在heroku上一样。

如果将以下属性放在GoogleStrategy初始配置对象中

proxy: true 

这对GoogleStrategy说,如果我们的请求通过任何代理运行,则您可以信任它。