2017-02-19 19 views
4

У меня есть только приложение Rails 5 API и использование детонации для аутентификации JWT.Как выполнить спецификацию запроса для аутентификации JWT-приложения с помощью RSpec

После завершения спецификации модели и модели я начну выполнять спецификацию запроса.

Но я понятия не имею, как закончить проверку подлинности внутри запроса спецификации в правильном направлении,

Мои пользователи контроллер,

module V1 
    class UsersController < ApplicationController 
    before_action :authenticate_user, except: [:create] 
    end 
end 

контроллер приложений,

class ApplicationController < ActionController::API 
    include Knock::Authenticable 
    include ActionController::Serialization 
end 

Мой глупое (вызовите запрос получения маркера, чтобы получить JWT перед запросом на отдых),

context 'when the request contains an authentication header' do 
    it 'should return the user info' do 
    user = create(:user) 
    post '/user_token', params: {"auth": {"email": user.email, "password": user.password }} 
    body = response.body 
    puts body # {"jwt":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0ODgxMDgxMDYsInN1YiI6MX0.GDBHPzbivclJfwSTswXhDkV0TCFCybJFDrjBnLIfN3Q"} 
    # use the retrieved JWT for future requests 
    end 
end 

Любые советы приветствуются.

ответ

4
def authenticated_header(user) 
    token = Knock::AuthToken.new(payload: { sub: user.id }).token 
    { 'Authorization': "Bearer #{token}" } 
    end 

    describe 'GET /users?me=true' do 
    URL = '/v1/users?me=true' 
    AUTH_URL = '/user_token' 

    context 'when the request with NO authentication header' do 
     it 'should return unauth for retrieve current user info before login' do 
     get URL 
     expect(response).to have_http_status(:unauthorized) 
     end 
    end 

    context 'when the request contains an authentication header' do 
     it 'should return the user info' do 
     user = create(:user) 

     get URL, headers: authenticated_header(user) 
     puts response.body 
     end 
    end 
    end 
0

С помощью ответа Ли Синьняна я смог реализовать что-то подобное по моей спецификации запроса. Разделите его здесь, чтобы другие увидели альтернативную реализацию.

# spec/requests/locations_spec.rb 
require 'rails_helper' 

RSpec.describe 'Locations API' do 
    let!(:user) { create(:user) } 
    let!(:locations) { create_list(:location, 10, user_id: user.id) } 

    describe 'GET /locations' do 
    it 'reponds with invalid request without JWT' do 
     get '/locations' 
     expect(response).to have_http_status(401) 
     expect(response.body).to match(/Invalid Request/) 
    end 

    it 'responds with JSON with JWT' do 
     jwt = confirm_and_login_user(user) 
     get '/locations', headers: { "Authorization" => "Bearer #{jwt}" } 
     expect(response).to have_http_status(200) 
     expect(json.size).to eq(10) 
    end 
    end 
end 

confirm_and_login_user(user) определяется в request_spec_helper, который включен в качестве модуля в rails_helper.rb:

# spec/support/request_spec_helper.rb 

module RequestSpecHelper 
    def json 
    JSON.parse(response.body) 
    end 

    def confirm_and_login_user(user) 
    get '/users/confirm', params: {token: user.confirmation_token} 
    post '/users/login', params: {email: user.email, password: 'password'} 
    return json['auth_token'] 
    end 
end 

Я использую JWT камень для создания моих маркеров, как описано в этом руководстве SitePoint (https://www.sitepoint.com/introduction-to-using-jwt-in-rails/)