Rails 6使用omniauth2完成Twitter授权后如何获取返回数据并解决字段为nil问题
排查与解决步骤
- 首先校验OmniAuth返回的原始数据结构
你当前代码直接取用auth.info.nickname、auth.info.name等字段,不同版本的Twitter OmniAuth适配包返回结构有差异,比如适配Twitter API v2的omniauth-twitter2的用户信息字段和旧版omniauth-twitter完全不同。你可以在twitter回调方法中加一行日志打印完整的auth对象:
触发一次授权流程后查看日志,确认用户昵称、头像、名称对应的字段路径是否正确,如果路径错误直接替换即可。Rails.logger.info auth.inspect - 校验更新操作是否执行成功
当前代码使用的是无异常抛出的update方法,即使更新失败也会正常走重定向逻辑,你看不到任何报错。你可以先将update替换为update!:
再次触发授权,如果更新失败会直接抛出异常,从异常信息就能定位问题:比如是twitter_account.update!( name: auth.info.name, image: auth.info.image, token: auth.credentials.token, secret: auth.credentials.secret, )TwitterAccount模型有字段验证规则没满足(比如要求username非空、唯一),还是字段被模型的属性保护规则拦截了。 - 校验Twitter开发者后台的权限配置
如果你用的是Twitter API v2,需要在开发者后台的项目OAuth权限配置中,开启users.read权限,同时授权链接的scope要包含读取用户资料的对应参数,否则授权后只会返回access token,不会返回用户的公开信息,导致你拿到的info字段全为空。 - 校验模型属性与查询逻辑配置
确认TwitterAccount模型中没有使用attr_protected、attr_accessor屏蔽name、username、image三个字段的写入权限,同时确认数据库迁移文件中这三个字段的类型、非空约束配置正确。另外你当前first_or_initialize的查询条件是username: auth.info.nickname,如果该字段本身为空会导致每次授权都新建重复绑定记录,建议换成Twitter返回的唯一用户IDauth.uid作为查询条件。
内容的提问来源于stack exchange,提问作者Justin Tyler
相关产品推荐
相关产品推荐

