Passport.js 在 nginx 上表达 google oauth 502 Bad Gateway

Posted

技术标签:

【中文标题】Passport.js 在 nginx 上表达 google oauth 502 Bad Gateway【英文标题】:Passport.js express google oauth 502 Bad Gateway on nginx 【发布时间】:2016-11-23 02:36:08 【问题描述】:

我正在尝试按照本指南使用 passport.js 为我的 Express.js 应用程序实现一个简单的 Google OAuth(只需将 facebook 替换为 google)https://github.com/passport/express-4.x-facebook-example/blob/master/server.js

当我在本地尝试时,一切似乎都运行良好。当我将它部署到我的 Ubuntu 生产服务器时,我在从 Google 到 /login/google/return 端点的重定向回调期间收到 502 Bad Gateway 错误。

app.get('/login/google/return', 
  passport.authenticate('google',  failureRedirect: '/login' ),
  function(req, res) 
    res.redirect('/');
  );

如果我注释掉passport.authenticate('google', ..) 行,那么错误就会消失。在检查 nginx 错误日志时,我看到了这个错误

upstream sent too big header while reading response header from upstream

这是 nginx 的服务器配置块:

location /auth/ 
   proxy_pass http://0.0.0.0:3000/;

这意味着我会通过转到https://example.com/auth/login/google 来登录google,然后被重定向到https://example.com/auth/login/google/return?code=4/adasfdafdsfd#,然后发生502 错误。

我曾尝试在我的 OS X 开发机器上设置类似的 nginx 环境,但那里没有出现问题。

我也尝试将以下内容添加到 nginx 块配置中,但这似乎也无济于事

proxy_buffers 8 16k;

对于如何调试/解决此问题,我束手无策。任何人的建议将不胜感激。这是到目前为止我的项目的链接https://github.com/tnguyen14/auth/blob/master/index.js

【问题讨论】:

只是为了确保我理解正确,如果你去example.com/auth/login/google你会得到你的登录页面,但如果你去example.com/auth/login/google/return你会得到502。你真的试过去@987654325 @?只需在地址栏中输入该地址并回车,您会得到 502 吗? 看看这个***.com/q/23844761/3284355 @Molda 如果我直接转到/login/google/return,它会很好地工作,因为它会重定向到 Google 的帐户选择器页面。只有当 Google 使用 502 发生的代码重定向到 /login/google/return 时。我认为您链接的答案不太相关,因为我没有使用 fastcgi。 【参考方案1】:

所以我很接近。 proxy_buffers 8 16k; 还不够。将以下两行添加到 nginx 修复它:

proxy_buffers 8 16k;
proxy_buffer_size 32k;

更新:原来,它抱怨标题大小的原因是因为我没有充分serialize 用户配置文件,所以对象对于 cookie 来说太大了。因为我使用的是cookie-session,所以所有的数据都被塞进了cookie,变得太大了。

在不添加 nginx 配置的情况下,修剪将通过护照会话序列化的内容可以解决此问题。

【讨论】:

以上是关于Passport.js 在 nginx 上表达 google oauth 502 Bad Gateway的主要内容,如果未能解决你的问题,请参考以下文章

Express Sequelize 和 Passport.js 身份验证策略不起作用

如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?

Passport.js 在 req.login 上失败

在集成测试中模拟不同的 passport.js 策略

passport.js 使用sails.js 验证弹出窗口

Passport.js本地策略如何保护路线