Rails Devise和devise_token_auth。没有合作

时间:2015-03-09 14:57:23

标签: ruby-on-rails authentication devise token

我有一个运行Devise进行身份验证的Rails 4.1应用程序。

要通过移动应用程序访问,我想使用推荐的devise_token_auth gem实现令牌身份验证。我不使用Omniauth

不应更改现有应用的功能。

我做了什么:

通过gemfile安装devise_token_auth。

使用了生成器:rails g devise_token_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

现在当我尝试sign_up新用户时,它会给我验证错误:

Uid不能为空

有人遇到同样的问题并解决了吗?

我觉得奇怪的是它需要安装Omniauth。

更新

我覆盖了Devise注册控制器创建操作:

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

现在,当我签名时,我得到:

{"错误":["仅限授权用户。"]}

在浏览器中

3 个答案:

答案 0 :(得分:4)

将以下内容添加到app / models / user.rb:

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

为我做了。还要确保提供商设置为" email" for" provider"。

答案 1 :(得分:0)

嗯,我目前正在努力做同样的事情。试图将devise_token_auth添加到Devise中,到目前为止它对我来说还不行。

就这一点而言,您是在谈论Devise的“sign_up”还是devise_token_auth?如果是Devise,我应该在创建记录之前设置uid=email来解决这个问题。

答案 2 :(得分:0)

此错误由devise_token_auth引发,而不是由devise引发。基本上,devise_token_auth试图以正常验证api请求的方式验证您的正常设计路由。您的正常设计路线是通过会话进行身份验证,而不是通过令牌,因此您将收到此错误:

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

这里可能会发生一些事情。首先,确保您只是在寻找API控制器操作的令牌验证。因此,请确保此行包含在BaseAPIController中,而不是在ApplicationController中。

include DeviseTokenAuth::Concerns::SetUserByToken

另一种可能性是你的routes.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
祝你好运!