2016-09-24 92 views
0

我正在用Ruby on Rails構建一個API,並且(試圖)用一個名爲Devise Token Auth的gem來構建用戶身份驗證。但我不確定在每個控制器操作之前驗證/驗證用戶的最佳方式。測試API用戶認證的最佳方法是什麼?

我知道before_action :authenitcate_user!調用,但它認爲我的用戶沒有登錄,因爲我從外部客戶端撥打電話。

我需要傳遞其他參數以及我沒有想到的請求嗎?像令牌或會話ID一樣?

回答

1

嘗試simple_token_authentication https://github.com/gonzalo-bulnes/simple_token_authentication與Devise一起使用,並且易於集成。 您只需發送用戶身份驗證令牌和電子郵件即可執行身份驗證。

+1

這是怎麼比設計令牌身份驗證不同?它是如何解決我在每次控制器操作之前認證用戶的問題? – user3661956

+0

嗨,如果你正在構建一個API,你必須發送每個請求的認證參數到你的服務器,這個gem驗證每個包含** acts_as_token_authentication_handler_for用戶**的控制器上的參數(默認爲email和token),你也可以do ** acts_as_token_authentication_handler_for用戶,只:[:method1,:method2] ** – Makarov

0

如果你正在構建一個輕量級的API應用程序,我會考慮使用Knock

Devise對於傳統應用程序來說是一個很好的解決方案,您需要一個完整的身份驗證解決方案,包括註冊,密碼編輯等。但它是圍繞基於會話的身份驗證設計的,由於瘋狂的可用自定義量,代碼庫有點怪異 - 基於令牌的身份驗證,你只能使用它的約1%。

基本設置是:

class ApplicationController < ActionController::API 
    include Knock::Authenticable 
    prepend_before_action :authenticate_user 
end 

現在,如果我們發送無有效Authorization: Bearer SOME_TOKEN頭磕請求將返回401 - Unauthorized響應。

我們可以像這樣測試它:

class UsersControllerTest < ActionDispatch::IntegrationTest 
    def token 
    Knock::AuthToken.new(payload: { sub: users(:one).id }).token 
    end 

    it 'does not allow an unauthenicated request' do 
    get users_path 
    assert_response :unauthorized 
    end 

    it 'allow an authenicated request' do 
    get users_path, headers: { authorization: "Bearer #{token}" } 
    assert_response :success 
    end 
end