passport-facebook登录异常:本地权限正常,开发环境缺失指定权限
下面是导致公网环境无法获取指定权限的几个可能原因及对应解决办法:
公网环境使用的账号未加入应用测试名单
Facebook应用处于开发模式时,只有开发者、测试员、管理员角色的账号才能请求public_profile之外的权限。如果公网环境登录的账号不在这个名单里,Facebook会自动只返回默认权限。
解决:登录Facebook开发者后台,找到你的应用,进入「角色」页面,把公网环境测试用的账号添加为测试员。回调路由中多余的
scope设置干扰流程
你的代码在回调路由(/auth/${loginType}/callback)里也设置了scope,但passport-facebook的授权范围只需要在发起授权的路由(第一个/auth/${loginType})中配置,回调阶段的scope参数不会生效,甚至可能导致Facebook忽略之前的权限请求。
解决:删除回调路由passport.authenticate配置里的scope选项,修改后的代码如下:router.get( `/auth/${loginType}/callback`, passport.authenticate(loginType, { failureRedirect: '/', }), /* some middleware */ );公网环境的
redirect_uri未在Facebook应用中配置
Facebook要求授权请求的redirect_uri必须和应用设置里的「有效OAuth跳转URI」完全匹配。如果公网环境的回调地址没添加到这个列表里,Facebook会拒绝非默认权限的请求,只返回基础权限。
解决:在Facebook开发者后台的应用「设置」-「基本」页面,找到「有效OAuth跳转URI」,添加公网环境的完整回调地址(比如https://your-public-domain/auth/facebook/callback)。passport-facebook版本存在兼容性问题
较旧版本的passport-facebook可能对Facebook OAuth 2.0的权限参数处理有bug,导致在非localhost环境下无法正确传递scope参数。
解决:升级passport-facebook到最新版本,执行命令:npm update passport-facebook
内容的提问来源于stack exchange,提问作者Le Phan Cong Minh

