2014-04-06 22 views
7

Tôi có một ứng dụng mà người dùng Devise + Omniauth cho phép người dùng đăng ký qua Facebook. Tôi cũng đang sử dụng Carrierwave để cho phép người dùng tải lên hình ảnh hồ sơ của riêng họ và xử lý hình ảnh được yêu cầu từ Facebook. Như vậy, tôi có các chức năng sau đây trong bộ điều khiển và sử dụng mô hình:Facebook Omniauth + Carrierwave Hồ sơ Hình ảnh

user.rb

def self.find_for_facebook_oauth(data, signed_in_resource=nil) 
user = User.where(:email => data.info.email).first 
unless user 
    params = 
    { 
     :user => 
     { 
     :username => data.uid, 
     :email => data.info.email, 
     :password => Devise.friendly_token[0,20], 
     :user_profile_attributes => 
      { 
      :first_name => data.info.first_name, 
      :last_name => data.info.last_name, 
      :remote_image_url => data.info.image 
      }, 
     :user_auths_attributes => 
     [{ 
      :uid => data.uid, 
      :provider => data.provider 
     }] 
     } 
    } 
    user = User.create!(params[:user]) 
end 
return user 
end 

omniauth_callbacks_controller.rb

def facebook 
# You need to implement the method below in your model (e.g. app/models/user.rb) 
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"]) 

if @user.persisted? 
    sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
    set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    redirect_to new_user_registration_url 
end 
end 

Thật không may, tôi tiếp tục chạy vào lỗi này:

ActiveRecord::RecordInvalid (Validation failed: User profile image could not download file: redirection forbidden: http://graph.facebook.com/813865346/picture?type=square -> https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/t5.0-1/1118622_813865346_1465272585_q.jpg): 
app/models/user.rb:68:in `find_for_facebook_oauth' 
app/controllers/users/omniauth_callbacks_controller.rb:4:in `facebook' 

Dòng 68 là user = User.create!(params[:user])

Logging các params[:user] cung cấp các giá trị sau:

Params: {:username=>"*", :email=>"*", :password=>"iePVLt7XEWk4YwPjja6n", :user_profile_attributes=>{:first_name=>"*", :last_name=>"*", :remote_image_url=>"http://graph.facebook.com/*/picture?type=square"}, :user_auths_attributes=>{:uid=>"*", :provider=>"facebook"}} 

Tôi muốn một số giúp đỡ về để vượt qua lỗi này.

+1

Hãy xem http://stackoverflow.com/a/22664100/2300000 bạn có thể tìm thấy nó hữu ích. Đó là một vấn đề với uri mở theo mặc định mở uri không cho phép chuyển hướng. Mặc dù bạn cần phải xác định lại phương thức find_for_facebook_oauth của mình để làm cho nó hoạt động. Nếu bạn có bất kỳ vấn đề nào, hãy cho tôi biết trong các ý kiến ​​ – Monideep

Trả lời

28

Tôi đang đối mặt với cùng một vấn đề. Có vẻ như vấn đề là http chuyển hướng đến https. Vì vậy, tôi thay thế chúng bằng gsub như sau:

user.remote_avatar_url = auth.info.image.gsub('http://','https://') 
+1

@Dmitri: Nó giải quyết được vấn đề. –

+1

Cảm ơn +100! : D –

+1

phải được đánh dấu là câu trả lời – ImranNaqvi

14

Chiến lược omniauth-facebook có một tùy chọn để thay đổi url hình ảnh đến một url an toàn https.

secure_image_url: Set to true to use https for the avatar image url returned in the auth hash.

Ví dụ, bức tranh với một url an toàn sẽ được yêu cầu trong devise.rb hoặc omniauth.rb theo cách này:

provider :facebook, 'secrets', 'secrets', :secure_image_url => true

https://github.com/mkdynamic/omniauth-facebook#configuring

0

Tôi đồng ý với câu trả lời Sandeep Laxman, sự cố là http phải thay thế bằng https, vì là hình ảnh an toàn từ Facebook, chúng tôi có thể sử dụng gsub #ref ruby-doc

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

hoặc sử dụng sub

user.remote_avatar_url = auth.info.image.sub('http:','https:') 
Các vấn đề liên quan