http和https之间的PassportJS回调切换

时间:2013-12-23 08:35:09

标签: javascript node.js facebook passport.js

现在,当我在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&notif_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将始终未定义。

但仍然不知道如何解决这个问题。

5 个答案:

答案 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(“信任代理”);“在主应用程序文件上就解决了!