Ruby on Rails omniauth and carrierwave



我在我的Ruby on Rails应用程序中使用omniauth(omniauth-facebook(。我想知道我是否可以检索用户的城市、国家和性别信息。以及如何使用载波拍摄用户头像,

谢谢。

使用(Carrierwave Documentation([https://github.com/carrierwaveuploader/carrierwave] 作为我的参考,您需要修改用户模型以添加新字段以支持 carrierwave gem 功能。

通常这意味着:

class User < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
end

但是如果你使用MongoDB而不是SQL/ActiveRecord,它会有所不同。

您可以通过在 rails 控制台中初始化新对象并检查可用字段来测试此新字段是否存在。

bundle exec rails c 
u = User.new
u.(tab twice quickly to see the available options)
# You are looking for the avatar field
u.avatar

您可以从控制台设置它以使用

File.open('somewhere') do |f|
u.avatar = f
end

最后,一旦对其进行测试,您将它添加到视图中的表单字段中。您通常为用户提供 CRUD,因此在视图的创建/更新表单中,您可以修改这些表单以包含文件格式(这是 HTML 而不是专门用于 rails,因此您可以在搜索中使用 HTML 查找更多信息(,添加后,您将需要修改相应的控制器以将值列入白名单,以便可以使用这些控制器操作保存它。

该过程类似于在初始生成用户模型后向用户对象添加其他字段。

通常 omniauth 会返回一个只与身份验证相关的标准答案,基本上是一个包含emailname/first/lastprofile_picture urlusername等组合的哈希。有些提供商会为您提供电子邮件,有些则不会,其他提供商仅在您通过范围专门请求时提供某些字段。

对于Facebook,我在我的omniauth.rb上使用以下(内部配置/初始值设定项/*(

provider :facebook, ENV['FB_ID'], ENV['FB_SECRET'], scope: 'public_profile, email, manage_pages, user_friends', info_fields: 'id, first_name, last_name, link, email', image_size: 'large'

这意味着在成功授权后,Facebook 将向我提供一封电子邮件,一些基本信息,例如响应哈希上的 ID、名字和姓氏(全能身份验证负责安排(。它将提供的令牌也将用于管理页面,尽管我最初不要求与之相关的任何字段。

因此,在您的情况下,您会要求citycountry以及info_fields中的任何内容(通过他们的图形浏览器仔细检查您不需要这些字段的任何额外范围(。

通过 omniauth 获得响应后(它基本上是一段编写为中间件的代码,为您执行 oauth2 流程 - 您也可以自己完成(,您将拥有一个个人资料图片 URL。 您需要下载该图片。 使用 carrierwave,您可以在控制器或模块/类上执行此操作,方法是实例化设置上传器的列,然后执行方法 .download!将下载位置的 URL 传递给它:

user.avatar = AvatarUploader.new
user.avatar.download! omniauth_hash['blabla_fields']['blabla_picture_url']

这将下载一个远程图片 URL 并将其另存为常规的 carrierwave 附件,然后您可以通过模型正常访问该附件。

最新更新