簡體   English   中英

如何在我的導軌 API 中有效地使用 Devise 和 Doorkeeper?

[英]How do I effectively use Devise and Doorkeeper in my rails API?

我很難理解流行的 Doorkeeper 和 Devise gems 的職責和功能。 我在授權和身份驗證方面沒有過多的經驗,所以如果我誤解了這些領域的某些方面,請原諒我。 我確實很努力,如果我做某事,我想以正確的方式去做,所以這是我目前的情況:

我想構建一個僅 API 的 rails 應用程序,該應用程序負責在用戶注冊和使用服務時對其進行身份驗證和授權。 我精心挑選了兩個相當流行的寶石,稱為 Doorkeeper(授權)和 Devise(身份驗證)。

我目前有這個結構並且它有效,但是,我在完全理解這些寶石的職責時遇到了問題。 據我了解,Devise gem 用作身份驗證層,這意味着可以識別和登錄用戶(其他功能將在下面討論)。 另一方面,Doorkeeper 將確保資源只能由有權訪問的成員訪問。 我選擇 Doorkeeper 進行 OAuth2 集成是因為我的服務器需要能夠在未來向潛在的第三方授予對 API 的訪問權限。

我的首要問題是我對這些寶石的假設是否正確。

這是當前的身份驗證/授權流程:

問題:用戶注冊,如果我的 API 沒有 Devise 發送確認 email,我該如何使用 Devise 來發送確認? (旁注:可恢復、可記住、可跟蹤和可確認的特征在用戶模型/遷移中。)

同樣,我很想知道如何實現潛在的密碼重置。 請注意,只要它們適用於我的用例,對示例的引用就足夠了。

我知道 Devise 提供了這些功能,但是如果不打他們預先配置的(查看?)路線,很難弄清楚如何做到這一點。

例如,當用戶注冊時,他點擊了我自己的user_controller的 create 方法,它基本上只是創建一個新用戶,是否應該自動發送確認 email (如果我們假設我的郵件配置是正確的)?

我不完全確定避免預先配置的路線是否有意義,這就是為什么我想聽聽更有經驗的人的意見,如果我的想法是正確的或者我是否完全關閉,他們過去可能使用過這些寶石這個。

如果你繞過自動機制並希望手動重新實現它們,那么設計真的是為你做的一切......你會犯錯。 不要繞過控制器mecanism並使用devise的wiki進行小型自定義,例如在創建/更新后更改重定向。

Devise為您處理確認電子郵件(可確認)和密碼重置(可恢復)系統,因此使用他們的系統,它只是激活的選項。

如果你想改變他們的觀點(我們總是想要自定義布局)你可以:

rails g devise:views

它將通過您的自定義視圖保持設計流程。

如果您想停止使用特定的機制,只需將其從模型中刪除即可。

devise :database_authenticatable, :registerable, :confirmable, :recoverable

如果根本不使用它們(意味着刪除選項並在路由中使用除外),避免預先配置的路由是有意義的,但是如果你想要Devise提供的所有機制,它在這里沒有意義。

他們的Wiki非常密集,但一次又一次地閱讀,你需要的一切就在這里。

最后 :Yes Gatekeeper提供了一個很好的OAuth2提供程序系統,並與Devise很好地混合,所以你在這里做了一個很好的選擇。 他們的觀點系統也是可定制的。

您可能還想查看能夠處理用戶角色和權限的cancancan (簡單,API,管理員等)。

希望能幫助到你 !

我已經完成了您正在尋找的事情,我真的認為這是一個不錯的選擇。 我從來沒有后悔過。 您實際上想要做的是具有與本機 Devise 實現完全相同的行為,但通過 API 在引擎上實現。 另外,您想將其應用於 Doorkeeper 授權。

簡短的回答是:覆蓋默認視圖/控制器/路由。

為什么要覆蓋視圖?

您正在使用 Rails API 意味着響應將是JSON但您正在使用某種標准來包裝它,並且Devise可能不一樣。 例如,如果你想尊重 OpenAPI 標准,它本身是不可能的(如果我錯了,請糾正我)。

這將導致 controller 的覆蓋以及您返回的 100%。 我還要在這里添加一個關於版本控制的額外層。 現在你的計划可能已經確定,但你不知道明天。

覆蓋 controller 會導致路由本身的覆蓋。

等等,我該怎么做?

在你的全局Gemfile.rb

# Gemfile.rb
gem 'devise'

devise 初始化程序是否在引擎上沒有任何變化 像往常一樣保持config/initializers/devise.rb

路由現在在您的引擎上定義:

# your_engine/config/routes.rb

YourEngine::Engine.routes.draw do
  namespace :v1, format: false, defaults: { format: :json } do
    devise_for :users, controllers: { sessions: 'your_engine/v1/users/sessions',
                                      registrations: 'your_engine/v1/users/registrations',
                                      confirmations: 'your_engine/v1/users/confirmations',
                                      unlocks: 'your_engine/v1/users/unlocks',
                                      omniauth_callbacks: 'your_engine/v1/users/omniauth_callbacks',
                                      passwords: 'your_engine/v1/users/passwords' },
                       skip: %i[sessions]
  end
end

自從我們談論 API 以來,我故意跳過了sessions ,並且沒有這樣的事情(目前)。

使用資源所有者密碼憑據將 Devise 添加到 Doorkeeper:

Doorkeeper.configure do
    base_controller 'ActionController::API'

    api_only

    resource_owner_from_credentials do |routes|
        user = User.find_for_database_authentication(:email => params[:email])
        if user && (user.valid_for_authentication? { user.valid_password?(params[:password]) })
          user
        end
    end
end

您的所有控制器都必須從Device controllers繼承。 我從中激發了自己的靈感,做出了我的超越。

這樣,您可以擁有 Devise 的 API 入口點,但您也可以擁有另一個具有非 api 訪問權限的入口點來構建另一個引擎。 這是相同的過程,但要求來自與 API 不同的順序(視圖 -> 控制器 -> 路由)。 對於引擎上的 Devise,我會說理解順序是路由 -> 控制器 -> 視圖。

我希望這可以幫助你。 祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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