簡體   English   中英

使用devise_token_auth時如何通過Rails API驗證用戶是否擁有請求的資源

[英]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_insign_out均可成功創建會話並返回一些頭信息。 返回的重要部分是clientaccess-tokenuid ,我需要在以后的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 )。

或者,您可以為此使用流行的“框架”解決方案,例如CanCanCanPundit 我以及大多數現代社區會推薦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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM