Ошибка авторизации на ruby ​​в api-проекте rails с Devise и ActiveAdmin - PullRequest
0 голосов
/ 07 октября 2018

Я новичок в Ruby on Rails.Я добавил gems, Devise и ActiveAdmin, чтобы создать экран управления и создать систему аутентификации для моего API.

Сначала я добавил ActiveAdmin.После переноса db я запросил localhost: 3000 / admin / login, и он вернул мне статус 200 (ОК) и интерфейс входа в систему.

Затем я добавил Devise.После некоторого кодирования для аутентификации и db-миграции, localhost: 3000 / admin / login вернул мне 401 статус, и "{"error":"You need to sign in or sign up before continuing."}" было написано на странице localhost: 3000 / admin / login.И абсолютно Это не показывало интерфейс входа в систему.

Здесь я не знаю, почему произошла ошибка авторизации перед авторизацией.

Версия для Mac OS: 10.13.1

Версия Ruby: 2.4.2

Версия Gem: 2.7.4

Версия Rails: 5.1.6

application_contorller.rb

class ApplicationController < ActionController::Base
  include AbstractController::Translation

  before_action :authenticate_user_from_token!

  respond_to :json

  def authenticate_user_from_token!
    auth_token = request.headers['Authorization']

    if auth_token
      authenticate_with_auth_token(auth_token)
    else
      authenticate_error
    end
  end

  private

  def authenticate_with_auth_token(auth_token)
    unless auth_token.include?(':')
      authenticate_error
      return
    end

    user_id = auth_token.split(':').first
    user = User.where(id: user_id).first
    @current_user = user

    if user && Devise.secure_compare(user.access_token, auth_token)
      # ログインを許可
      sign_in user, store: false
    else
      authenticate_error
      render json: {error: "hello_error"}, status: 401
    end
  end

  def authenticate_error
    render json: {error: t('devise.failure.unauthenticated')}, status: 401
  end
end

app/controller/v1/sessions_controller.rb

module V1
  class SessionsController < ApiController
    skip_before_action :authenticate_user_from_token!

    # POST /v1/login
    def create
      @user = User.find_for_database_authentication(email: params[:email])
      return invalid_email unless @user

      if @user.valid_password?(params[:password])
        sign_in :user, @user
        render json: @user, serializer: SessionSerializer, root: nil
      else
        invalid_password
      end
    end

    def invalid_email
      warden.custom_failure
      render json: {error: t('invalid_email')}
    end

    def invalid_password
      warden.custom_failure
      render json: {error: t('invalid_password')}
    end
  end
end

config/routes.rb

Rails.application.routes.draw do

  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)
  devise_for :users

  namespace :admin, defaults: {format: :json} do
    delete 'sign_out', to: "sessions#destroy"

    resources :login, only: [:create], controller: :sessions
  end

  namespace :v1, defaults: {format: :json} do
    resources :login, only: [:create], controller: :sessions
  end


  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...