2014-04-06 22 views
7

Mam aplikację, która pozwala użytkownikowi Devise + Omniauth na rejestrację przez Facebooka. Używam także Carrierwave, aby umożliwić użytkownikom przesyłanie własnego obrazu profilu i przetwarzanie obrazu żądanego z Facebooka. Jako takie, mam następujące funkcje w modelu regulatora i użytkownika:Facebook Omniauth + Carrierwave Zdjęcie profilowe

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 

Niestety, wciąż działa w ten błąd:

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' 

Gdzie linia 68 to user = User.create!(params[:user])

rejestrowania params[:user] udostępnia następujące wartości:

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"}} 

chciałbym jakąś pomoc na przejechaniu tego błędu.

+1

Spójrz na http://stackoverflow.com/a/22664100/2300000 może okazać się pomocne. Jest to problem z otwartym uri, ponieważ domyślnie otwarty uri nie pozwala na przekierowanie. Chociaż musisz ponownie rozważyć metodę find_for_facebook_oauth, aby działała. Jeśli masz jakiekolwiek problemy daj mi znać w komentarzach – Monideep

Odpowiedz

28

Miałem do czynienia z tym samym problemem. Wydaje się, że problem polegał na przekierowaniu na numer http na numer https. Więc wymieniłem je za pomocą gsub następująco:

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

@Dmitri: To rozwiązuje problem. –

+1

Dzięki +100! : D –

+1

powinien być oznaczony jako odpowiedź – ImranNaqvi

14

Strategia omniauth-facebook ma możliwość zmiany adresu URL obrazu do bezpiecznej https URL.

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

Na przykład obraz z bezpiecznym adresem URL zostanie złożony wniosek w devise.rb lub omniauth.rb ten sposób:

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

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

0

zgadzam się z odpowiedzią Sandeep Laxman, problemem jest http musi zastąpić https, ponieważ jest bezpieczny obraz z Facebooka, możemy użyć gsub #ref ruby-doc

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

lub użyj sub

user.remote_avatar_url = auth.info.image.sub('http:','https:') 
Powiązane problemy