Фейсбук логин по omniauth на heroku не работает

Я создал приложение с функцией входа в Facebook от Rails, которое отлично работало на localhost, но теперь оно не работает на Heroku. Это похоже на общую проблему, с которой сталкиваются все, но ни один из прошлых вопросов или других статей не помог.

изображение ошибки

Приведенная выше ссылка ведет на изображение ошибки. Это должно быть из Heroku, но из Facebook, потому что я видел ту же ошибку, когда имел дело со Stripe. До того, как эта ошибка начала беспокоить меня, была еще одна ошибка из Facebook, говорящая Can't Load URL: The domain of this URL isn't included in the app's domains. To be able to load this URL, add all domains and subdomains of your app to the App Domains field in your app settings. но это было решено добавлением URL Heroku на страницу приложения Facebook.

я сделал figaro heroku:set -e production поэтому ключи приложения и секреты были установлены в Heroku.

Вот несколько кодов из моих файлов;

конфиг / Инициализаторы /devise.rb

config.omniauth :facebook, ENV["facebook_app_id"], ENV["facebook_app_secret"], scope: 'email', info_fields: 'email,name', secure_image_url: true

приложение / модели /user.rb

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
    user.name = auth.info.name   # assuming the user model has a name
    user.image = "http://graph.facebook.com/#{auth.uid}/picture?type=large" # assuming the user model has an image
    # If you are using confirmable and the provider(s) you use validate emails,
    # uncomment the line below to skip the confirmation emails.
    # user.skip_confirmation!
  end
end

Контроллеры / пользователи /omniauth_callback_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.from_omniauth(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

  def failure
    redirect_to root_path
  end
end

Герои бревен

2017-07-17T15:33:54.234171+00:00 app[web.1]: Started GET "/users/auth/facebook/callback?code=AQCoKbzr4 ///// 00703" for 150.116.22.144 at 2017-07-17 15:33:54 +0000
2017-07-17T15:33:54.236011+00:00 app[web.1]: I, [2017-07-17T15:33:54.235951 #4]  INFO -- omniauth: (facebook) Callback phase initiated.
2017-07-17T15:33:54.360053+00:00 app[web.1]: Processing by Users::OmniauthCallbacksController#facebook as HTML
2017-07-17T15:33:54.360097+00:00 app[web.1]:   Parameters: {"code"=>"AQCoKbzr4nv6c7BEpM ///// 86c27a00703"}
2017-07-17T15:33:54.371557+00:00 app[web.1]:   User Load (1.8ms)  SELECT  "users".* FROM "users" WHERE "users"."provider" = $1 AND "users"."uid" = $2  ORDER BY "users"."id" ASC LIMIT 1  [["provider", "facebook"], ["uid", "102081518247"]]
2017-07-17T15:33:54.581790+00:00 heroku[router]: at=info method=GET path="/users/auth/facebook/callback?code=AQCoK ///// a00703" host=xxxxxxx-xxxx-xxxxx.herokuapp.com request_id=93945-1199-417e-8d98-ede264cb fwd="150.116.22.144" dyno=web.1 connect=1ms service=350ms status=500 bytes=1754 protocol=https
2017-07-17T15:33:54.578410+00:00 app[web.1]: Completed 500 Internal Server Error in 218ms (ActiveRecord: 3.0ms)
2017-07-17T15:33:54.579175+00:00 app[web.1]: 
2017-07-17T15:33:54.579178+00:00 app[web.1]: RuntimeError (redirection forbidden: http://graph.facebook.com/102087018247/picture?type=large -> https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/13064_10202475740292_410664266178542_n.jpg?oh=ef118e9d947604c9c7055a92e2&oe=5A02F8B4):
2017-07-17T15:33:54.579178+00:00 app[web.1]:   app/models/user.rb:18:in `block in from_omniauth'
2017-07-17T15:33:54.579179+00:00 app[web.1]:   app/models/user.rb:14:in `from_omniauth'
2017-07-17T15:33:54.579180+00:00 app[web.1]:   app/controllers/users/omniauth_callbacks_controller.rb:4:in `facebook'
2017-07-17T15:33:54.579180+00:00 app[web.1]: 
2017-07-17T15:33:54.579181+00:00 app[web.1]:

Я понятия не имею что RuntimeError из журналов Heroku указывает... Любая подсказка или совет будут оценены.

2 ответа

Решение

Вы получили ошибку перенаправления, потому что URL-адрес изображения перенаправит пользователя на другой URL-адрес. и существует ограничение в open-uri при перенаправлении http на https.

В сообщении об ошибке вы можете увидеть этот URL: http://graph.facebook.com/102087018247/picture?type=large будет перенаправлен на https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/13064_10202475740292_410664266178542_n.jpg?oh=ef118e9d947604c9c7055a92e2&oe=5A02F8B4

Вы можете обойти эту проблему, заменив http на https в URL-адресе вашего изображения.

"https://graph.facebook.com/#{auth.uid}/picture?type=large"

или используя этот способ:

user.remote_image_url = auth.info.image.gsub(/\Ahttp:/, "https")

m Убедитесь, что вы добавили домен рабочих приложений в консоль Facebook для разработчиков.

Обычно я настраиваю приложение для субтестов из своего приложения по умолчанию, тестовое приложение имеет свои собственные ключи и для них устанавливаю ENV, а localhost заносится в белый список. Таким образом, разработка проще

Затем установите ENV для производственного приложения в вашем приложении и Heroku, с доменом Heroku в белом списке. Убедитесь, что ваш обратный вызов содержит рабочий домен Heroku, соответствующий тому, который вы занесли в белый список

Затем перенести базу данных Heroku после отправки в Heroku (эта часто работает для меня)

heroku run rake db:migrate

Кстати, ваш доступ к изображению отличается от того, как я это сделал.

user.remote_avatar_url = auth.info.image 

если это не работает, скажите мне, я настроил несколько входов в Facebook на Heroku в свое время.

Другие вопросы по тегам