Rails Devise API - Маршрут входа в систему отвечает «Вам необходимо войти или зарегистрироваться перед тем, как продолжить». - PullRequest
0 голосов
/ 09 октября 2018

В настоящее время я использую Devise с моим приложением Rails API для аутентификации пользователей с помощью devise-jwt.

Вот как выглядит моя модель User:

class User < ApplicationRecord
  devise :database_authenticatable,
         :registerable,
         :jwt_authenticatable,
         jwt_revocation_strategy: JWTBlackList
end

И config/routes.rbнастроен так:

Rails.application.routes.draw do
  devise_for :users,
         path: '',
         path_names: {
           sign_in: 'login',
           sign_out: 'logout',
           registration: 'signup'
         },
         controllers: {
           sessions: 'sessions',
           registrations: 'registrations'
         }
end

Это контроллер сессий:

class SessionsController < Devise::SessionsController

  private

  def respond_with(resource, _opts = {})
    render json: resource
  end

  def response_to_on_destroy
    head :no_content
  end
end

и контроллер регистрации:

class RegistrationsController < Devise::RegistrationsController
  respond_to :json

  def create
    build_resource(sign_up_params)

    resource.save
    render_resource(resource)
  end
end

Я провел несколько тестов Rspec, показанныхниже, которые были успешными -

require 'rails_helper'

RSpec.describe SessionsController, type: :request do
  let(:user) { create(:user) }
  let(:url) { '/login' }
  let(:params) do
    {
      user: {
        email: user.email,
        password: user.password
      }
    }
  end

  context 'when params are correct' do
    before do
      post url, params: params
    end

    it 'returns 200' do
      expect(response).to have_http_status(200)
    end

    it 'returns JTW token in authorization header' do
      expect(response.headers['Authorization']).to be_present
    end

    it 'returns valid JWT token' do
      decoded_token = decoded_jwt_token_from_response(response)
      expect(decoded_token.first['sub']).to be_present
    end
  end
end

Но когда я запускаю следующий запрос POST к /login на Почтальоне, я получаю следующее сообщение:

postman request

Справа вы видите консоль и сервер рельсов, показывающие, что учетные данные верны, но мы все равно получаем 401

Есть какие-нибудь подсказки, что может быть не так?Было трудно найти хорошие ресурсы для Devise с использованием Rails API.

Заранее спасибо

1 Ответ

0 голосов
/ 12 октября 2018

После просмотра SessionsController я обнаружил причину, по которой он вернул 401: warden пытался аутентифицировать пустое тело.Исправлено добавлением Content-Type к заголовку запроса

...