Javascript http和https之间的PassportJS回调开关

Javascript http和https之间的PassportJS回调开关,javascript,node.js,facebook,passport.js,Javascript,Node.js,Facebook,Passport.js,现在,当我在访问我的页面并单击“登录”时,它会转到,然后它会在facebook上做一些事情,最后会回电话。我似乎无法使用https方案让它回调(但只有在请求周期以https开始时) 现在,当通过https iframe(facebook画布应用程序)查看时,我发现了错误 [阻止]页面位于 '' 已通过HTTPS加载,但从运行不安全的内容 “…YXC0ZM8S45V2ITA629IAQUCPAQVUBHAVNCVEAGDBKG4J4#=”: 此内容也应通过HTTPS加载 我在heroku上运行这个

现在,当我在访问我的页面并单击“登录”时,它会转到,然后它会在facebook上做一些事情,最后会回电话。我似乎无法使用https方案让它回调(但只有在请求周期以https开始时)

现在,当通过https iframe(facebook画布应用程序)查看时,我发现了错误

[阻止]页面位于 '' 已通过HTTPS加载,但从运行不安全的内容 “…YXC0ZM8S45V2ITA629IAQUCPAQVUBHAVNCVEAGDBKG4J4#=”: 此内容也应通过HTTPS加载

我在heroku上运行这个,它在那里处理https上的细节

编辑 显然,节点提供了req.connection.encrypted,其中包含请求是否为https的信息。因为我在nginx后面的heroku上运行,在nginx后面处理节点之前的所有https,所以req.connection.encrypted始终是未定义的


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

很抱歉,这个答案有点站不住脚,我不能根据事情的性质给你一个具体的答案

我相信您在facebook api控制台中的回调url可能是http,如果您将其更改为https,它应该可以工作


如果不起作用,您可以尝试将回调url更改为完整url(
)https://example.com/auth/facebook/callback“

Nginx处理Heroku节点上的所有HTTPS,因此节点不会看到req.connection.encrypted是未定义的。通过翻阅passportjs存储库,我发现有一个应用程序启用了“信任代理”的检查。要解决此问题,请添加行

app.enable("trust proxy");

到您的express服务器。

我查看了Passport Oauth2策略代码,并检查它是否使用req.connection.encrypted来检查它是否处于安全连接中。 它还检查代理,以防服务器代码在代理之后运行。如果您知道自己是代理人的幕后黑手,可以告诉passport信任代理人

似乎因为SSL是由Heroku上的nginx处理的,所以req.connection.encrypted总是“未定义”。() Nginx处理Heroku上的所有HTTPS,所以节点永远不会看到req.connection.encrypted是“未定义”之外的任何内容

要解决此问题,您必须告诉passport信任添加行的代理

app.enable("trust proxy");

到您的express服务器。

我还了解到,我们可以通过在Google策略中添加另一个名为“proxy:true”的属性来完成相同的任务,如下所示:

passport.use(谷歌新战略)({ clientID:keys.googleClientID, clientSecret:keys.googleClientSecret, callbackURL:“/auth/google/callback”, 代理:true}


在尝试passport facebook和passport Discus时,我也遇到了同样的问题,使用Google时没有问题,因为它允许您使用http进行回调,但其他人没有


设置“应用程序启用(“信任代理”);”在主应用程序文件上解决了它!

关于如何根据请求方案/url动态生成完整url回调有什么想法吗?这是我考虑了一段时间的解决方案之一,但我没有访问那里的req的权限,所以我无法理解这些内容。@EliWhite,不,我认为你不能。另外,请参阅我更新的应答器Passporoauth2策略使用req.connection.encrypted来检查它是否处于安全连接中。你能尝试查看它的输出吗?也许你实际上是在一个不安全的连接下运行的。乔纳斯,这是一个很好的评论,感谢你为我指出了正确的方向。我在这里找到了一篇帖子:这篇评论说,因为SSL是由Heroku上的nginx处理的,req.connection.encrypted始终是“未定义”的。关于如何解决这个问题,有什么想法吗?Jonas,那条评论让我想出了解决问题的方法(翻查护照代码)。如果你能回答,我会给它荣誉点数。欢迎你接受我发布的答案(在这种情况下,我会删除我的答案).太好了!我试图把所有的信息放在一起。而且我没有在nginx
proxy\u set\u header X-Forwarded-Proto$scheme;中指定header;
app.enable("trust proxy");