我在我的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 会返回一个只与身份验证相关的标准答案,基本上是一个包含email
、name/first/last
、profile_picture url
、username
等组合的哈希。有些提供商会为您提供电子邮件,有些则不会,其他提供商仅在您通过范围专门请求时提供某些字段。
对于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、名字和姓氏(全能身份验证负责安排(。它将提供的令牌也将用于管理页面,尽管我最初不要求与之相关的任何字段。
因此,在您的情况下,您会要求city
,country
以及info_fields
中的任何内容(通过他们的图形浏览器仔细检查您不需要这些字段的任何额外范围(。
通过 omniauth 获得响应后(它基本上是一段编写为中间件的代码,为您执行 oauth2 流程 - 您也可以自己完成(,您将拥有一个个人资料图片 URL。 您需要下载该图片。 使用 carrierwave,您可以在控制器或模块/类上执行此操作,方法是实例化设置上传器的列,然后执行方法 .download!将下载位置的 URL 传递给它:
user.avatar = AvatarUploader.new
user.avatar.download! omniauth_hash['blabla_fields']['blabla_picture_url']
这将下载一个远程图片 URL 并将其另存为常规的 carrierwave 附件,然后您可以通过模型正常访问该附件。