Firebase部署后Facebook-Passport授权失败问题排查
嘿,这个EAI_AGAIN的错误我之前帮不少开发者排查过,咱们先把问题拆解清楚,再一步步解决:
首先看你给出的错误信息:
Error: { "name":"InternalOAuthError", "message":"Failed to obtain access token", "oauthError":{ "errno":"EAI_AGAIN", "code":"EAI_AGAIN", "syscall":"getaddrinfo", "hostname":"graph.facebook.com", "host":"graph.facebook.com", "port":443 } }
这个错误的核心是DNS解析失败——你的Firebase托管的应用没办法成功解析Facebook Graph API的域名(graph.facebook.com),导致没法发起请求获取access token。下面是几个最可能的原因和对应的解决方案:
1. 检查Firebase后端的网络访问权限
如果你是用Firebase Hosting配合Cloud Functions/Cloud Run做动态服务,首先要确认你的后端服务有没有出站访问公网的权限:
- 如果你的服务部署在VPC私有网络里,可能被限制了公网访问,需要配置Cloud NAT让服务可以访问外部API,或者添加防火墙规则允许443端口访问graph.facebook.com。
- 如果你用的是默认的Cloud Functions配置,默认是允许访问公网的,但可以去Firebase控制台的Functions设置里确认没有开启VPC隔离。
2. 核对Callback URL的配置
虽然这个错误是DNS问题,但回调URL配置错误也可能间接引发异常,务必检查这两点:
- 确认
config.host_name是你的Firebase托管的HTTPS域名(比如https://your-app.web.app或者你的自定义域名),Firebase托管默认强制HTTPS,不要漏掉协议头。 - 登录Facebook开发者后台,在应用的「Facebook登录」→「设置」里,把这个完整的回调URL(比如
https://your-app.web.app/sign-in/facebook/callback)添加到有效OAuth重定向URI列表里,确保没有拼写错误。
3. 升级依赖包版本
旧版本的passport或passport-facebook可能在Node.js环境下存在DNS解析的兼容性问题,尤其是依赖旧版request库的情况:
- 执行命令升级到最新版本:
npm update passport passport-facebook - 升级后重新部署你的应用:
firebase deploy --only hosting,functions
4. 确认环境变量配置正确
不要把敏感信息(比如Facebook的clientID、clientSecret)硬编码到代码里,也不要依赖本地的config文件,应该用Firebase的环境变量:
- 去Firebase控制台的「项目设置」→「环境变量」,添加
FACEBOOK_CLIENT_ID、FACEBOOK_CLIENT_SECRET、HOST_NAME这几个变量,对应你的配置值。 - 修改你的Passport配置代码,从环境变量读取值:
注意:这里你代码里写的是passport.use(new FacebookStrategy({ clientID: process.env.FACEBOOK_CLIENT_ID, clientSecret: process.env.FACEBOOK_CLIENT_SECRET, callbackURL: `${process.env.HOST_NAME}/sign-in/facebook/callback`, profileFields: ['id', 'displayName', 'picture.type(large)', 'emails'], enableProof: true, }, function(accessToken, refreshToken, profile, done) { process.nextTick(function () { AuthorService.loginWithGoogleSrv(profile, (err, user)=>{ return done(err, user); }) }); }));loginWithGoogleSrv,是不是笔误?应该是loginWithFacebookSrv?如果是笔误的话也要修正,避免后续逻辑出错。
5. 临时网络波动或部署区域问题
EAI_AGAIN有时候是临时的DNS解析波动,可以试试:
- 等待10-15分钟再测试,看看是不是临时故障。
- 如果是Cloud Functions,部署时指定一个网络更稳定的区域,比如:
firebase deploy --only functions --region us-central1
调试技巧
为了更精准排查,你可以在回调路由里添加详细的日志:
app.get('/sign-in/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/sign-in', failureFlash: true }), (req, res) => { res.redirect('../../user/account'); }, (err, req, res, next)=>{ console.error('Facebook OAuth Callback Error:', err); // 日志会输出到Firebase控制台 res.status(500).send(`OAuth失败: ${err.message}`); } );
然后去Firebase控制台的「Functions」→「日志」里查看详细的错误堆栈,确认是不是每次都触发DNS解析失败。
内容的提问来源于stack exchange,提问作者codedao

