Omniauth с Rails и React, проблема с корнями и перенаправлениями - PullRequest
0 голосов
/ 08 мая 2020

Я всем.

Я пытаюсь реализовать omniauth с Facebook и Google с рельсами и фронтальной реакцией. Аутентификация обрабатывается гемом авторизации токена devise. Аутентификация работает правильно, поскольку я могу подписать пользователя и использовать Ax ios, чтобы перехватить заголовки и сохранить информацию, которая мне нужна, чтобы позволить ему / ей перемещаться по веб-сайту. Но у меня другая проблема:

  • , когда я использую «обычную ссылку (http://localhost: 3000 / api / v1 / auth / facebook )», которая запустил процесс аутентификации. Процесс работает правильно, но у меня нет заголовков в ответе, поэтому Ax ios ничего не перехватывает для обновления локального хранилища. И если я пытаюсь визуализировать JSON, вместо этого я получаю страницу HTML с моим JSON на ней 2 вот мой контроллер omniauth
class Api::V1::Users::OmniauthCallbacksController < DeviseTokenAuth::OmniauthCallbacksController

def facebook
 @user = User.from_omniauth(request.env['omniauth.auth'])
 if @user.persisted?
   sign_in @user
   # Normal case with no headers
   redirect_to '/dashboard'

   # manually trying to render a json
   # headers = @user.create_new_auth_token
   # response = Hash.new 
   # response["user"] = @user 
   # response["headers"] = headers
   # render json: {response: response, status: :ok  }
 else
   session['devise.facebook_data'] = request.env['omniauth.auth']
   redirect_to new_user_registration_url
 end
end
end
  • , но если я пытаюсь использовать Ax ios вместо этого с запросом на получение http://localhost: 3000 / api / v1 / auth / facebook , у меня проблема с корсом даже с стойкой- Корс установлен. Вот метод cors на моем application.rb
module DeviseTokenAuthReactOmniauth
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    config.session_store :cookie_store, key: '_interslice_session'
    config.middleware.use ActionDispatch::Cookies # Required for all session management
    config.middleware.use ActionDispatch::Session::CookieStore, config.session_options

    config.middleware.insert_before 0, Rack::Cors, debug: true, logger: (-> { Rails.logger }) do
      allow do
        origins '*'
        resource '*',
          headers: :any,
          expose: ['access-token', 'expiry', 'token-type', 'uid', 'client'],
          methods: [:get, :post, :options, :delete, :put]
      end
    end
  end
end

cors issues with axios get request

, когда я запускаю связку exe c промежуточного программного обеспечения rake, я вижу, что Rack-cors находится после Webpacker

use Webpacker::DevServerProxy
use Rack::Cors
  • И если я пытаюсь отправить запрос на публикацию после добавления этого маршрута
    match '/api/v1/auth/facebook', to: 'api/v1/users/omniauth_callbacks#facebook', via: [:get, :post]

, я получаю RuntimeError ( Resource_class не найден). В этом случае кажется, что пространство имен и класс не распознаются. Я пробовал добавить префикс в свой файл omniauth.rb (OmniAuth.config.path_prefix = "/ api / v1 / auth"), но ничего не изменилось.

Это ссылка на мой проект для лучшего понимания. https://github.com/croisle/-devise-token-auth-react-omniauth

Кажется, что единственный способ запустить конфигурацию Rack-cors - это отправить запрос по почте. Я новичок ie, но думаю, что если я найду способ вернуть JSON, пойманный моими перехватчиками, это решит мою проблему, и мой пользователь будет перенаправлен на панель управления, но я его не вижу . Я надеюсь, что мое объяснение не для того, чтобы запутать, но если не просто сказать мне то, что непонятно. Так что любая помощь приветствуется. Спасибо

1 Ответ

0 голосов
/ 05 июня 2020

У меня была аналогичная проблема, в основном после сбора некоторых пользовательских данных и последующего использования ax ios для вызова контроллера rails, который затем перенаправлялся на провайдер аутентификации, приводил к ошибке CORS .

Чтобы избежать этой проблемы, вместо того, чтобы позволить контроллеру рельсов выполнять перенаправление, я отправляю клиенту ответ об успешном завершении, в котором говорится, что сервер проверил данные пользователя и некоторые зашифрованные данные добавлены в сеанс, а затем в ax ios Я отправляю пользователя поставщику аутентификации, используя window.location.href.

что-то вроде:

axios({
  method: 'post',
  url: '/signup/user',
  data: data,
})
.then(response => {
  // check if response is successful then call the omniauth endpoint
  window.location.href = '/auth/facebook'
})
...