Я сделал оба стиля, которые вы упомянули, на моем собственном опыте мне больше нравилось иметь отдельный проект реагирования и использовать rails api, может быть, потому что я использую docker для своих сборок, и у меня было несколько проблем, когда я использовал гем rails-реагировать и webpacker, но преимущество в том, что вам не нужно делать 2 развертывания, в обоих подходах вам придется настраивать API.
ps: прекомпиляции webpacker в рельсах иногда могут быть довольно тяжелыми
Для обоих вам понадобится JWT-токен для аутентификации, но здесь - это хорошее руководство по настройке
, если вы хотите использовать оба метода аутентификации (html & json) вы можете использовать что-то подобное в контроллере сессий
class Users::SessionsController < Devise::SessionsController
respond_to :json, :html
# before_action :configure_sign_in_params, only: [:create]
def create
if request.format.html?
super
# super {
# cookies[:token] = current_token || ""
# }
else
resource = User.find_for_database_authentication(email: params[:email])
return invalid_login_attempt unless resource
if resource.valid_password?(params[:password])
sign_in(resource, store: false)
@payload = [resource, current_token]
render(status: 200, success: true, json: @payload)
else
invalid_login_attempt
end
end
end
def invalid_login_attempt
warden.custom_failure!
render json: {
success: false,
message: 'Error with your email or password'
}, status: 401, status: :unauthorized
end
def current_token
request.env['warden-jwt_auth.token']
end
private
def respond_with(resource, _opts = {})
if request.format.html?
super
else
render status: 401, success: false, json: { error: 'No autorizado' }
end
end
def respond_to_on_destroy
if request.format.html?
super
else
head :ok
end
end
end
, вероятно, есть лучший способ сделать это, но он работает для меня, lol