我正在用Ruby on Rails構建一個API,並且(試圖)用一個名爲Devise Token Auth的gem來構建用戶身份驗證。但我不確定在每個控制器操作之前驗證/驗證用戶的最佳方式。測試API用戶認證的最佳方法是什麼?
我知道before_action :authenitcate_user!
調用,但它認爲我的用戶沒有登錄,因爲我從外部客戶端撥打電話。
我需要傳遞其他參數以及我沒有想到的請求嗎?像令牌或會話ID一樣?
我正在用Ruby on Rails構建一個API,並且(試圖)用一個名爲Devise Token Auth的gem來構建用戶身份驗證。但我不確定在每個控制器操作之前驗證/驗證用戶的最佳方式。測試API用戶認證的最佳方法是什麼?
我知道before_action :authenitcate_user!
調用,但它認爲我的用戶沒有登錄,因爲我從外部客戶端撥打電話。
我需要傳遞其他參數以及我沒有想到的請求嗎?像令牌或會話ID一樣?
嘗試simple_token_authentication https://github.com/gonzalo-bulnes/simple_token_authentication與Devise一起使用,並且易於集成。 您只需發送用戶身份驗證令牌和電子郵件即可執行身份驗證。
如果你正在構建一個輕量級的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
這是怎麼比設計令牌身份驗證不同?它是如何解決我在每次控制器操作之前認證用戶的問題? – user3661956
嗨,如果你正在構建一個API,你必須發送每個請求的認證參數到你的服務器,這個gem驗證每個包含** acts_as_token_authentication_handler_for用戶**的控制器上的參數(默認爲email和token),你也可以do ** acts_as_token_authentication_handler_for用戶,只:[:method1,:method2] ** – Makarov