现在,当我在https://example.com访问我的页面并点击登录时,它会转到https://example.com/auth/facebook,然后点击Facebook的内容并最终回拨http://example.com/auth/facebook/callback。我似乎无法使用https方案回调它(但仅当请求周期以https开始时)。
现在,当通过https iframe(facebook canvas app)查看时,我收到了错误
[已屏蔽]页面位于 'https://apps.facebook.com/example/?fb_source=notification&ref=notif¬if_t=app_notification' 是通过HTTPS加载的,但运行的是不安全的内容 'http://example.com/auth/facebook/callback?code=AQD5TUeTP ... yXC0ZM8S45V2iTta629IaquCpAqVUbhAvNCFveaDBlbKg4J4# = ': 此内容也应通过HTTPS加载。
passport.use(new FacebookStrategy({
clientID: process.env.FB_CLIENT,
clientSecret: process.env.FB_SECRET,
callbackURL: "/auth/facebook/callback",
profileFields: ['id']
},...
app.get('/auth/facebook',
passport.authenticate('facebook', {
scope: ["read_stream"]
})
);
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
failureRedirect: '/#'
}),
function(req, res) {
res.redirect('/#');
});
我在heroku上运行它,它处理https上的详细信息。
修改 的 显然,node提供req.connection.encrypted,其中包含有关请求是否为https的信息。由于我在nginx后面的heroku上运行,它处理节点之前的所有https,因此req.connection.encrypted将始终未定义。
但仍然不知道如何解决这个问题。
答案 0 :(得分:16)
我查看了Passport Oauth2策略代码并检查它是否使用req.connection.encrypted来检查它是否在安全连接中。 如果服务器代码在一个服务器代码后面运行,它还会检查代理。如果您知道自己落后于代理人,可以告诉护照信任代理人。
似乎因为SSL是由Heroku上的nginx处理的,所以req.connection.encrypted总是“未定义”。 (groups.google.com/forum/#!topic/express-js/Bm6yozgoDSY) Nginx处理Heroku上的所有HTTPS,因此节点永远不会看到req.connection.encrypted不是“undefined”。
要解决此问题,您必须告诉护照信任代理添加行
app.enable("trust proxy");
到您的快递服务器。
答案 1 :(得分:3)
我还了解到,我们可以通过向googleStrategy添加另一个名为“proxy:true”的属性来完成同样的事情,如下所示:
passport.use(新的GoogleStrategy({ clientID:keys.googleClientID, clientSecret:keys.googleClientSecret, callbackURL:'/ auth / google / callback', proxy:true }
答案 2 :(得分:2)
Nginx处理Heroku上的所有HTTPS,因此节点永远不会看到req.connection.encrypted是未定义的。通过挖掘passportjs存储库,我发现有一个检查应用程序有#34;信任代理"启用。要解决此问题,请添加行
app.enable("trust proxy");
到您的快递服务器。
答案 3 :(得分:0)
对不起,这个答案有点蹩脚,根据事物的性质,我真的无法给你一个具体的答案。
我相信你的facebook api控制台中的回调网址可能是http,如果你把它改成https就行了。
如果这不起作用,您可以尝试将callbackURL更改为完整网址("https://example.com/auth/facebook/callback"
)
答案 4 :(得分:0)
我尝试使用passport-facebook和passport-disqus时遇到了同样的问题,对于Google来说,这没有问题,因为它允许您使用http进行回调,而其他人则没有。
设置“ app.enable(“信任代理”);“在主应用程序文件上就解决了!