Eli*_*ite 7 javascript facebook node.js passport.js
现在,当我访问我的页面https://example.com并单击登录时,它会转到https://example.com/auth/facebook,然后执行facebook的操作并最终回拨http:// example.com/auth/facebook/callback.我似乎无法使用https方案回调它(但仅当请求周期以https开始时).
现在,当通过https iframe(Facebook画布应用程序)查看时,我收到错误
[已屏蔽]" 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('/#');
});
Run Code Online (Sandbox Code Playgroud)
我在heroku上运行它,它在https上处理细节.
EDIT 显然节点提供req.connection.encrypted,其中包含有关请求是否为https的信息.由于我在nginx后面的heroku上运行,它处理节点之前的所有https,因此req.connection.encrypted将始终未定义.
但仍然不知道如何解决这个问题.
Jon*_*nas 19
我查看了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");
Run Code Online (Sandbox Code Playgroud)
到你的快递服务器.
小智 6
我还了解到我们可以通过向 googleStrategy 添加另一个名为“proxy:true”的属性来完成同样的事情,如下所示:
passport.use(new GoogleStrategy({ clientID: keys.googleClientID, clientSecret: keys.googleClientSecret, callbackURL: '/auth/google/callback', proxy: true }
| 归档时间: |
|
| 查看次数: |
1893 次 |
| 最近记录: |