簡體   English   中英

Rails Devise和devise_token_auth。 不能一起工作

[英]Rails Devise and devise_token_auth. Not working alongside

我有一個運行Devise進行身份驗證的Rails 4.1應用程序。

為了通過移動應用程序進行訪問,我想使用推薦的devise_token_auth gem實現令牌認證。 我不使用Omniauth

現有應用程序的功能不應更改。

我做了什么:

通過gemfile安裝了devise_token_auth。

使用了生成器:rails g devise_token_auth:install用戶auth

更改了遷移以添加必填字段。 由於缺少Omniauth,遷移失敗。 所以我也安裝了它。

更改了routes.rb

devise_for :users, :skip => [:sessions, :registrations, :omniauth_callbacks]
  as :user do
    get 'register' => 'users/registrations#new', :as => :new_user_registration
    post 'register' => 'users/registrations#create', :as => :user_registration
    get 'sign_in' => 'devise/sessions#new', :as => :new_user_session
    post 'sign_in' => 'devise/sessions#create', :as => :user_session
    delete '/' => 'users/sessions#destroy', :as => :destroy_user_session
  end

添加:

namespace :api do
scope :v1 do
  mount_devise_token_auth_for 'User', at: 'auth', skip: [:omniauth_callbacks]
end

結束

在用戶模型中,我有:

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :confirmable, :timeoutable, :lockable
include DeviseTokenAuth::Concerns::User

現在,當我嘗試注冊一個新用戶時,它給了我驗證錯誤:

Uid不能為空

有人有同樣的問題並解決了嗎?

我發現奇怪的是,它需要安裝Omniauth。

更新:

我覆蓋了Devise注冊控制器的create動作:

build_resource(sign_up_params)
 resource.uid = resource.email
 resource.provider = ''

現在,當我登錄時我得到:

{“錯誤”:[“僅授權用戶。”]}

在瀏覽器中。

將以下內容添加到app / models / user.rb:

before_validation do
  self.uid = email if uid.blank?  
end

為我做了。 還要確保將提供者設置為“電子郵件”。

好吧,我目前正為同樣的事情而苦苦掙扎。 試圖將devise_token_auth添加到Devise,到目前為止,它對我來說還行不通。

就目前而言,您是在談論Devise或devise_token_auth “ sign_up”嗎? 如果用於Devise,我應該在創建記錄之前設置uid=email解決此問題。

該錯誤是由devise_token_auth引起的,而不是由devise引起的。 因此,從本質上講,devise_token_auth嘗試以與通常對api請求進行身份驗證相同的方式對您的常規devise路由進行身份驗證。 您的正常設計路線是通過會話而不是通過令牌進行身份驗證的,因此您會收到以下錯誤消息:

{"errors":["Authorized users only."]} 

這里可能發生幾件事。 首先,請確保僅在對API控制器的操作進行令牌驗證。 因此,請確保此行包含在BaseAPIController中,而不包含在ApplicationController中。

include DeviseTokenAuth::Concerns::SetUserByToken

另一種可能性是您的route.rb中存在一些命名空間問題。 確保您有這樣的東西。 您需要首先擁有devise_for,並正確命名token_auth的名稱空間,否則它將導致其他路由的驗證問題。

Rails.application.routes.draw do

  devise_for :admins

  namespace :api do
    scope :v1 do
      mount_devise_token_auth_for 'user', at: 'auth'
    end
  end
end

祝好運!

暫無
暫無

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

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