Придумайте возврат 401 на правильном входе в систему с пользовательским контроллером сессий - PullRequest
5 голосов
/ 12 октября 2011

У меня возникли некоторые проблемы, связанные с разработкой и созданием пользовательских контроллеров сессий.

Я создаю приложение и хочу, чтобы json был единственной формой входа в систему.Итак, вот что я сделал до сих пор.

Контроллер сеансов

class SessionsController < Devise::SessionsController

  # Create operation should login the user and respond with json status
  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => "sessions#failure")
    sign_in(resource_name, resource)

    respond_to do | format |
      format.json { render :json => { :success => true, :user => resource }, :status => 200 }
    end
  end

  def failure
    return render :status => 401, :json => {:success => false, :errors => ["Login failed."]}
  end  

end

Маршруты сеансов:

  devise_for :users, :controllers => {:sessions => "sessions"}, :skip => [:sessions] do
    get '/login' => 'sessions#new', :as => :new_user_session
    post '/login' => 'sessions#create', :as => :user_session
    get '/logout' => 'sessions#destroy', :as => :destroy_user_session
  end

Тест Я пытаюсь запустить:

require 'spec_helper'

describe SessionsController do
  include Devise::TestHelpers

  describe "POST 'create'" do
      describe "invalid signin" do

        before(:each) do
          @attr = { :email => "master_yoda@jedi.com", :password => "invalid" }
          request.env["devise.mapping"] = Devise.mappings[:user]
        end

        it "should return an error" do
          post :create, :user => @attr,  :format => :json

          puts @response.body
        end

      end
  end
end

Теперь, когда я запускаю этот тест.Я получаю ответ http вместо json:

#<ActionDispatch::Response:0x00000004cb8bb8>

Когда я выполняю операцию скручивания через командную строку для ввода данных

Это команда:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d ' {"user":{"email":"aaa@blah.com","password":"aaaaaaaaa"}}'  http://192.168.202.128:3000/login

При первом выполнении отправляется 401, затем при последующих выполнениях отправляется 200

Ошибка:

* About to connect() to 192.168.202.128 port 3000 (#0)
*   Trying 192.168.202.128... connected
* Connected to 192.168.202.128 (192.168.202.128) port 3000 (#0)
> POST /login HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: 192.168.202.128:3000
> Accept: application/json
> Content-type: application/json
> Content-Length: 57
> 
< HTTP/1.1 401 Unauthorized 
< Content-Type: application/json; charset=utf-8
< X-Ua-Compatible: IE=Edge
< Cache-Control: no-cache
< X-Runtime: 2.026670
< Content-Length: 44
< Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
< Date: Mon, 10 Oct 2011 14:03:36 GMT
< Connection: Keep-Alive
< Set-Cookie: _styylt_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRkkiJWIxZDZiMmZkNTdlYTFkMzQ1MTRkZGZmNDA1NjljYzU5BjsAVA%3D%3D--fd27eebb575f61cf805b0f3ada4d2780fdc7f929; path=/; HttpOnly
< 
* Connection #0 to host 192.168.202.128 left intact
* Closing connection #0
{"success":false,"errors":["Login failed."]}

Успех:

* About to connect() to 192.168.202.128 port 3000 (#0)
*   Trying 192.168.202.128... connected
* Connected to 192.168.202.128 (192.168.202.128) port 3000 (#0)
> POST /login HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: 192.168.202.128:3000
> Accept: application/json
> Content-type: application/json
> Content-Length: 57
> 
< HTTP/1.1 200 OK 
< Content-Type: application/json; charset=utf-8
< X-Ua-Compatible: IE=Edge
< Etag: "c4da2521fa2f6c5721e7cf8d3c7626ce"
< Cache-Control: max-age=0, private, must-revalidate
< X-Runtime: 0.377351
< Content-Length: 71
< Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
< Date: Mon, 10 Oct 2011 14:03:45 GMT
< Connection: Keep-Alive
< Set-Cookie: _styylt_session=BAh7B0kiGXdhcmRlbi51c2VyLnVzZXIua2V5BjoGRVRbCEkiCVVzZXIGOwBGWwZpCUkiIiQyYSQxMCRnUEJzRDZXSHNTYkk0RkZxSlNjV0cuBjsAVEkiD3Nlc3Npb25faWQGOwBGSSIlY2M2ZGEzMWY0ZDM2ZDc2NjRmNjdhN2I1MjQ4NmFlMTkGOwBU--8fec7bbcf648276f24e3c19a3ce0562060eeabb1; path=/; HttpOnly
< 
* Connection #0 to host 192.168.202.128 left intact
* Closing connection #0
{"success":true,"user":{"email":"aaa@blah.com","username":"userblah2"}}

Я не понимаю, что я делаю неправильно или что здесь происходит.Я просмотрел большинство сообщений и не может найти конкретный ответ.

Надеюсь, кто-нибудь сможет помочь:)

Спасибо

Ответы [ 2 ]

2 голосов
/ 01 октября 2012

Это ошибка в тестовом помощнике Devise. Это было исправлено в 2074 .

0 голосов
/ 29 января 2012

У меня точно такая же проблема.Я не могу понять, почему response.body возвращает «ActionDispatch :: Response ...» вместо фактического тела ответа.Это похоже на проблему с warden.authenticate!только в тестах.Использование curl также работает для меня, как вы описали.В конце я просто изменил свою спецификацию на следующее:

context "with invalid credentials" do
  it "re-renders login page" do
    post :create, person: { email: @person.email, password: 'badpassword' }
    response.should be_ok
    response.should render_template("devise/sessions/new")
  end

  it "returns an error with json" do
    post :create, person: { email: @person.email, password: 'badpassword' }, format: 'json'
    response.status.should == 403
  end
end

Хотя вы не можете полностью проверить ответ json, по крайней мере, вы все еще проверяете код состояния ошибки ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...