![](/img/trans.png)
[英]how to properly authenticate user with devise_token_auth rails gem?
[英]How to validate that a user owns the requested resource through Rails API when using devise_token_auth
我正在構建一個僅API(目前)的Rails應用程序,以作為我正在構建的Android應用程序的后端。 我以前使用過Firebase,但想對應用程序數據進行更多處理,並且我不想讓所有邏輯都使移動客戶端膨脹,因此我不再使用Firebase的實時數據庫,而是使用Rails支持應用程序數據。 我還使用了非常簡單的Firebase身份驗證。 但是,將整個系統的所有功能都集中在一個地方似乎並不那么復雜,因此我也想在Rails應用程序中執行身份驗證和用戶管理。
我已經安裝了devise_token_auth
(在此處看到)並完成了基本配置。 如果提供了參數並創建了一個用戶,則/auth
路由可以正常工作。 sign_in
和sign_out
均可成功創建會話並返回一些頭信息。 返回的重要部分是client
, access-token
和uid
,我需要在以后的API調用中使用它們。 我相信這些都是無效的,並在以后的每次調用中都被替換。 在流程的這一部分,我不確定如何進行。 我不了解這些標頭中的數據如何與登錄的用戶相關聯,以及如何驗證他們擁有他們請求的資源。 用另一種方式總結問題:
如何將用戶登錄到API,然后驗證哪個用戶在進行后續的API調用?
我的Android應用程序是一個任務管理器,因此我需要能夠驗證例如,如果user 1
請求task 3
,那么他們擁有該資源。 我也不確定如何使用API定向索引調用。 也就是說,當命中索引端點( /tasks
)時,如何從API標頭中的數據中識別出應該檢索哪些用戶任務。
我無法使用devise_token_auth
找到任何可靠的教程或示例,因此我很難將現在各部分之間的交互聯系在一起。 我知道這是一個棘手的問題-在此先感謝您的指導。
我如何驗證哪個用戶正在進行后續的API調用?
使用current_user
方法。 這是devise_token_auth
gem的內置功能 。
我需要能夠驗證例如,如果用戶1請求任務3,那么他們擁有該資源
您可以采用許多不同的方法。 您可以使用current_user
方法在每個控制器操作中編寫一些自定義邏輯(並在必要時返回403 forbidden
)。
或者,您可以為此使用流行的“框架”解決方案,例如CanCanCan
或Pundit
。 我以及大多數現代社區會推薦Pundit
。
我強烈建議您閱讀該庫的自述文件,因為它非常有幫助。 但是對於上面的示例,您可以編寫如下內容:
class TasksController
def show
task = Task.find(params[:id])
authorize(task) # !!!
render task
end
end
# app/policies/task_policy.rb
class TaskPolicy
def show?
record.user == user
end
end
(請注意,默認情況下,Pundit策略中的“ user
”調用方法: current_user
。這在項目的自述文件中都有詳細說明。)
當索引端點被命中(
/tasks
)時,如何從API標頭中的數據中識別出應該檢索哪些用戶任務
同樣,所有這些都作為Pundit
的標准功能的一部分進行處理。 你只需要定義一個TaskPolicy::Scope
,並呼吁policy_scope(Task)
控制器-作為解釋在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.