Я новичок в 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