Вход в Oauth2 для Facebook, Linkedin и Google перестал работать с Devise и Omniauth, но все еще работает для LinkedIn и Twitter
У меня есть сайт, который настроен для работы с несколькими API Oauth2, использующими Devise с Omniauth, и работал до прошлой недели. В настоящее время вход в систему через Twitter и Github по-прежнему работает нормально; Тем не менее, Facebook, LinkedIn и Google выдают мне сообщение о том, что URI перенаправления не совпадает. Сообщения об ошибках гласят:
facebook:
ОШИБКА - omniauth: (facebook) Ошибка аутентификации! invalid_credentials: >OAuth2::Error,: {"error":{"message":"Ошибка при проверке кода подтверждения. Убедитесь, что ваш>redirect_uri идентичен тому, который вы использовали в запросе диалога OAuth","type":"OAuthException","код": 100, "fbtrace_id": "XXXXXXXXXX"}}
LinkedIn:
ОШИБКА - omniauth: (linkedin) Ошибка аутентификации! invalid_credentials: >OAuth2::Error, invalid_request: отсутствуют обязательные параметры, содержит недопустимое значение параметра, параметр более одного раза.: Невозможно получить токен доступа: appId или URI перенаправления не соответствуют коду авторизации или истек срок действия кода авторизации {"error_description": "отсутствуют обязательные параметры, содержит недопустимое значение параметра, параметр более одного раза.: Невозможно получить токен доступа: appId или URI перенаправления не соответствует коду авторизации или истек срок действия кода авторизации "," ошибка ":" invalid_request "}
ОШИБКА - omniauth: (google_oauth2) Ошибка аутентификации! invalid_credentials: >OAuth2::Error, redirect_uri_mismatch: { "error": "redirect_uri_mismatch" }
Я просмотрел запросы, которые были отправлены для всех трех из них в консоли разработчика Chrome, и URI перенаправления для обратного вызова совпадает с URI, зарегистрированным для каждого API (который не изменился с момента его работы).
Проблема с обратным отслеживанием этой ошибки заключается в том, что я не уверен на 100%, когда они перестали работать, когда я входил в систему напрямую или использовал логин Github во время недавних интеграционных тестов, когда я устанавливал новые функциональные возможности. (Большой урок!) Одно из значительных изменений, которые могут повлиять на это, заключается в том, что я интегрировал расширение Traceable для Devise, которое заставило меня потребовать драгоценный камень Warden. Однако я удалил конфигурацию Traceable и Warden и восстановил пользовательскую модель и файлы конфигурации в их прежнем состоянии, и у меня возникла та же проблема.
Я бы предпочел предоставить больше примеров кода, но, если честно, я не уверен, с какого кода начинать. Я надеюсь, что кто-то испытал подобную проблему и может указать верное направление, чтобы начать.
Для начала ниже приведен мой инициализатор Devise с удаленными комментариями
Devise.setup do |config|
config.mailer_sender = 'no-reply@' + ENV['DOMAIN_NAME']
config.mailer = 'Devise::Mailer'
require 'devise/orm/active_record'
config.case_insensitive_keys = [:email]
config.strip_whitespace_keys = [:email]
config.skip_session_storage = [:http_auth]
config.stretches = Rails.env.test? ? 1 : 10
config.allow_unconfirmed_access_for = 10.days
config.reconfirmable = true
config.confirmation_keys = [:email]
config.remember_for = 2.weeks
config.expire_all_remember_me_on_sign_out = true
config.password_length = 8..72
config.email_regexp = /\A[^@]+@[^@]+\z/
config.reset_password_keys = [:email]
config.reset_password_within = 6.hours
config.sign_in_after_reset_password = true
config.sign_out_via = :get
# ==> OmniAuth
# Add a new OmniAuth provider. Check the wiki for more information on setting
# up on your models and hooks.
# config.omniauth :github, 'APP_ID', 'APP_SECRET', scope: 'user,public_repo'
require "omniauth-google-oauth2" # Added Based on Response to Another Stackru Issues - Did Not Help.
OMNIAUTH = YAML.load(File.read(File.expand_path('../../omniauth.yml', __FILE__))).deep_symbolize_keys
OMNIAUTH.each_value do |provider|
config.omniauth provider[:reference].to_sym, ENV[provider[:key_ref]], ENV[provider[:secret_ref]], { :scope => provider[:scope] }
end
end
Загруженный файл omniauth.yml выглядит следующим образом:
facebook: { reference: "facebook",
name: "Facebook",
scope: "email, public_profile, user_birthday",
key_ref: "FACEBOOK_KEY",
secret_ref: "FACEBOOK_SECRET" }
twitter: { reference: "twitter",
name: "Twitter",
scope: "r_fullprofile, r_emailaddress",
key_ref: "TWITTER_KEY",
secret_ref: "TWITTER_SECRET" }
linkedin: { reference: "linkedin",
name: "LinkedIn",
scope: "r_basicprofile r_emailaddress",
key_ref: "LINKEDIN_KEY",
secret_ref: "LINKEDIN_SECRET" }
github: { reference: "github",
name: "GitHub",
scope: "user, public_repo",
key_ref: "GITHUB_KEY",
secret_ref: "GITHUB_SECRET" }
google: { reference: "google_oauth2",
name: "Google",
scope: "email, profile",
key_ref: "GOOGLE_KEY",
secret_ref: "GOOGLE_SECRET" }
2 ответа
У меня была точно такая же проблема, Facebook работал, linkedin и Google - нет.
После некоторого копания / поиска в Google я смог решить мою проблему путем понижения:
gem 'omniauth-oauth2', '1.3.1'
Итак, мой Gemfile выглядит так:
gem 'devise'
gem 'koala'
gem 'omniauth-oauth2', '1.3.1'
gem 'omniauth-facebook'
gem 'omniauth-google-oauth2'
gem 'omniauth-linkedin-oauth2'
Я просмотрел и обновил все драгоценные камни Omniauth, так как были последние версии версий, и все проблемы были решены.