Базовая аутентификация Rails с сообщением об ошибке JSON - PullRequest
0 голосов
/ 05 июля 2019

У меня есть приложение Rails 5.2 в режиме API. Если запрос предоставлен с правильными учетными данными базовой аутентификации, ожидаемые данные JSON { status: true, data: 'test_user_data' } будут обработаны.

users_controller.rb

class Api::UsersController < ApplicationController
  before_action :basic_authenticate

  def get_user_info
    render json: { status: true, data: 'test_user_data' }
  end

  private

  def basic_authenticate
    authenticate_or_request_with_http_basic do |username, password|
      username == 'test_name' && password == 'test_password'
    end
  end
end

application_controller.rb

class ApplicationController < ActionController::API
    include ActionController::HttpAuthentication::Basic::ControllerMethods
end

Однако, если не удается выполнить базовую аутентификацию, отображается только простой текст HTTP Basic: Access denied..

То, что я хотел бы сделать, - это выводить сообщения об ошибках в JSON в случае сбоя аутентификации, что-то вроде { status: false, message: 'basic authentication failed'}.

Как правильно это исправить?

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

authenticate_or_request_with_http_basic принимает необязательный параметр message (который, к сожалению, второй в списке параметров, поэтому "Application" для первого параметра).

В Rails 5 просто измените ваш код на:

def basic_authenticate
  message = { status: false, message: 'basic authentication failed' }.to_json

  authenticate_or_request_with_http_basic("Application", message) do |username, password|
    username == 'test_name' && password == 'test_password'
  end
end

Реализация изменилась в Rails 6, и поэтому в Rails 6 самая базовая реализация будет выглядеть так:

def basic_authenticate
  message = { status: false, message: 'basic authentication failed' }.to_json

  authenticate_or_request_with_http_basic(nil, message) do |username, password|
    username == 'test_name' && password == 'test_password'
  end
end
0 голосов
/ 05 июля 2019

Используйте спасение в вашем application_controller.rb, как показано ниже

rescue_from User::NotAuthorized, with: :deny_access # self defined exception

def deny_access
  render json: { status: false, message: 'basic authentication failed'}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...