2014-07-15 84 views
3

我需要一些幫助來測試以下內容。我做RailsCast有關保護的API:http://railscasts.com/episodes/352-securing-an-api?view=asciicast我如何測試基於令牌的身份驗證?

我有一個before_filter一個RequestController檢查,如果要求有一個令牌:

class RequestsController < ApplicationController 
    include ActionController::MimeResponds 
    include ActionController::HttpAuthentication::Token::ControllerMethods 

    before_filter :restrict_access 
    respond_to :json 

#... 

def authenticate 
    return restrict_access 
    end 

    private 
    def restrict_access 
    authenticate_or_request_with_http_token do |token, options| 
     ApiKey.exists?(access_token: token) 
    end 
    end 

end 

我沒有RSpec的測試看起來像:

it 'responds successfully to generic request because of key protection' do 
    api_key = ApiKey.create 
    api_key.save! 

    get :index 
    request.headers["token"] = api_key.access_token 
    expect(response).to be_success # test for the 200 status-code 
end 

結果:expected success? to return true, got false

我不明白我怎麼可以注入有效的api_key到re追求,以便迴應將評估爲真實。有任何想法嗎?謝謝。

回答

6

令牌認證需要一個HTTP_AUTHORIZATION標題格式爲:

Token token="my-api-token" 

此外,你要設置的報頭中的get :index前行:

request.headers["HTTP_AUTHORIZATION"] = "Token token=\"#{api_key.access_token}\"" 
get :index 

可以使用encode_credentials方法來代替如果您願意:

request.headers["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Token.encode_credentials(api_key.access_token) 
+0

can I arbitra rily命名其他'.headers []'值?例如,我可以執行'request.headers [「username」] =「Joe」',然後用'request.headers [「username」]'在我的控制器中引用它。 –

+0

看起來您忘記在第二個示例中的access_token後添加右括號。 – couchoud

相關問題