Обратный звонок для Omniauth-Trello (RoR) - не могу войти - PullRequest
1 голос
/ 13 мая 2019

Я использую RoR 5.2, devise и omniauth-trello gem. Я не могу войти с Trello. Мне нужно создать возможность входа без существующего пользователя с возвращенным провайдером и uid: он должен создать пользователя, если он не существует.

Я уже добавил в config / rout.rb:

devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks' }

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

config.omniauth :trello, "#{Rails.application.credentials.trello[:key]}", "#{Rails.application.credentials.trello[:secret]}"

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

Rails.application.config.middleware.use OmniAuth::Builder do
      provider :trello, Rails.application.credentials.trello[:key], Rails.application.credentials.trello[:secret],
               app_name: "Trello-Rooney", scope: 'read,write,account', expiration: 'never'
end

приложение / контроллеры / omniauth_callbacks_controller.rb

class OmniauthCallbacksController < Devise::OmniauthCallbacksController

      def trello
        @user = User.from_omniauth(request.env['omniauth.auth'])

        if @user.persisted?
          sign_in_and_redirect @user, event: :authentication
          set_flash_message(:notice, :success, kind: 'Trello') if is_navigational_format?
        end
      end

end

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

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: %i[trello]


  def self.from_omniauth(auth)
    user = User.where(provider: auth.provider, uid: auth.uid.to_s).first
    return user if user

    email = auth.info[:email]

    while email.nil?
      generated_email = "#{SecureRandom.base58(10)}@roonyx.trello"
      if User.where(email: generated_email).blank?
        email = generated_email
      end
    end

    user = User.where(email: email).first

    if user
      user.update(provider: auth.provider, uid: auth.uid)
    else
      password = Devise.friendly_token[0, 12]
      user = User.create!(email: email, password: password, password_confirmation: password, provider: auth.provider, uid: auth.uid)
    end
    user
  end


end

Но когда я пытаюсь войти в систему с помощью Trello, я вижу это в консоли. Похоже, это не вызывает мой звонок. Кто-нибудь может помочь? Заранее спасибо.

E, [2019-05-13T14:10:29.647241 #19958] ERROR -- omniauth: (trello) Authentication failure! service_unavailable: Net::HTTPFatalError, 500 "Internal Server Error"
[2019-05-13 14:10:29] (pida=19958)   INFO -- : Processing by OmniauthCallbacksController#failure as HTML
[2019-05-13 14:10:29] (pida=19958)   INFO -- :   Parameters: {"oauth_token"=>"47215df2b25b4fc089953da32acf0730", "oauth_verifier"=>"8a0b310f2afe98d0aebbd2073efc5b54"}
[2019-05-13 14:10:29] (pida=19958)   INFO -- : Redirected to http://localhost:3000/users/sign_in
[2019-05-13 14:10:29] (pida=19958)   INFO -- : Completed 302 Found in 1ms (ActiveRecord: 0.0ms)

1 Ответ

2 голосов
/ 13 мая 2019

Ошибка прямо в вашем журнале: Authentication failure! service_unavailable: Net::HTTPFatalError, 500 "Internal Server Error"

Ваш обратный вызов не выполняется, поскольку вы вставили промежуточное ПО OmniAuth::Builder.Вы можете попытаться удалить это и проверить params, которые отправляются вместе с обратным вызовом.

После удаления промежуточного программного обеспечения вы можете поместить byebug или binding.pry вверху вашего обратного вызова.действие.Как только вы окажетесь в отладчике, проверьте значение request.env['omniauth.auth'].Это должно дать вам некоторое представление о том, в чем проблема.Трудно сказать больше, не зная больше об окружающей среде.

...