【问题标题】:Devise + Omniauth + Carrierwave doesn't save facebook/github profile imageDevise + Omniauth + Carrierwave 不保存 facebook/github 个人资料图片
【发布时间】:2017-04-05 11:08:40
【问题描述】:

在我只使用 Omni auth + devise 让用户注册之前。一切正常。后来我决定使用简单的注册形式的设计。我对其进行了配置,它也可以正常工作,但是当用户想要使用 Omni auth 进行注册时,就会出现问题。 Avatar 始终设置为 nil,即使 facebook/Github 正在返回指向个人资料图片的链接。我已经尝试过这个solution,但是仍然无法正常工作,我知道载波远程位置上传方法。我用于 Omni auth 的 Gem 是 omniauth-facebook 和 omniauth-github。

(1)

User.rb

代码:

class User < ApplicationRecord
  include Storext.model
  devise :database_authenticatable, :registerable, :omniauthable,
     :recoverable, :rememberable, :trackable, :validatable
  validates :first_name, :last_name, :email, :experience_level,
        :goal_level, :theoretical_learner_level, presence: true
  mount_uploader :avatar, AvatarUploader

  # Override devise method for Oauth
  def self.new_with_session(params, session)
    if session['devise.user_attributes']
      new(session['devise.user_attributes'].merge(session[:user_attributes])) do |user|
        user.attributes = params
        user.valid?
      end
    else
      super
    end
  end

  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid).to_hash).first_or_create do |user|
      OauthUserGenerator.new(user: user, auth: auth).generate
    end
  end

  # If sign in through Oauth, don't require password
  def password_required?
    super && provider.blank?
  end

  # Don't require update with password if Oauth
  def update_with_password(params, *options)
    if encrypted_password.blank?
      update_attributes(params, *options)
    else
      super
    end
  end
end

(2)

oauth_user_generator.rb

代码:

class OauthUserGenerator
  def initialize(user:, auth:)
    @user = user
    @auth = auth
  end

  def generate
    @user.provider = @auth.provider
    @user.uid = @auth.uid
    @user.email = @auth.info.email
    @user.password = Devise.friendly_token[0, 20]
    @user.first_name = @auth.info.name.split[0]
    @user.last_name = @auth.info.name.split[1]
    @user.remote_avatar_url = @auth.info.image
  end
end

(3)

omniauth_callbacks_controller.rb

代码:

class OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def omniauth_providers
    process_oauth(request.env['omniauth.auth'].merge(session.fetch(:user_attributes, {})))
  end

  alias facebook omniauth_providers
  alias github omniauth_providers

  private

  def process_oauth(omniauth_params)
    user = User.from_omniauth(omniauth_params)
    if user.persisted?
      flash.notice = 'Signed in!'
      sign_in_and_redirect user
    else
      session['devise.user_attributes'] = user.attributes
      redirect_to new_user_email_registration_path
    end
  end
end

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby devise carrierwave omniauth


    【解决方案1】:

    不久前我遇到了类似的问题。 显然,carrierwave 不允许 remote_url 从一个协议重定向到另一个协议。您使用auth.info.image 获得的网址是http 网址,它重定向到https 网址。所以在你的OauthUserGeneratorclass 中,在你的generate 方法上。尝试执行以下操作:

    @user.remote_avatar_url = @auth.info.image.gsub('http', 'https')
    

    这样重定向将来自https -&gt; https。这对我有用。希望您也遇到同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多