我有一个运行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 = ''
现在,当我签名时,我得到:
{"错误":["仅限授权用户。"]}
在浏览器中。
答案 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
祝你好运!