2017-04-05 14 views
0

ユーザーがサインアップする前にOmni auth + deviseを使用する前に。すべてがうまくいきました。後で簡単なサインを使用することに決めました。私はそれを設定し、それもうまくいきましたが、ユーザがOmni認証を使ってサインアップしたいときに問題が発生します。 facebook/Githubがプロフィール画像へのリンクを返すにもかかわらず、アバターは常にゼロに設定されます。私はこれを試しましたsolutionしかし、まだ動作していないと私はキャリア波リモートロケーションのアップロード方法を認識しています。 Omniの認証に使用した宝石はomniauth-facebookとomniauth-githubです。Devise + Omniauth + Carrierwaveはfacebook/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 

ありがとうございました。

答えて

1

もう少し前に同様の問題がありました。 確かに、carrierwaveはプロトコルから別のものにリダイレクトするremote_urlを許可しません。 auth.info.imageのURLはhttpのURLで、httpsのURLにリダイレクトされます。だから、generateメソッドのOauthUserGeneratorクラスにあります。次の操作を実行してください。

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

こうすると、リダイレクトはhttps -> httpsになります。それは私のために働いた。あなたにとっては同じ問題だと思っています。

関連する問題