首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails Devise和devise_token_auth。不能同时工作

Rails Devise和devise_token_auth。不能同时工作
EN

Stack Overflow用户
提问于 2015-03-09 22:57:23
回答 3查看 4.5K关注 0票数 8

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

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

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

我做了什么:

已通过gemfile安装devise_token_auth。

使用生成器: rails g devise_token_auth:install用户身份验证

已更改迁移以添加必填字段。由于缺少Omniauth,迁移失败。所以我也安装了它。

更改的routes.rb

代码语言:javascript
复制
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

添加:

代码语言:javascript
复制
namespace :api do
scope :v1 do
  mount_devise_token_auth_for 'User', at: 'auth', skip: [:omniauth_callbacks]
end

结束

在用户模型中,我有:

代码语言:javascript
复制
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :confirmable, :timeoutable, :lockable
include DeviseTokenAuth::Concerns::User

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

Uid不能为空

是否有人遇到了同样的问题并解决了它?

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

更新:

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

代码语言:javascript
复制
build_resource(sign_up_params)
 resource.uid = resource.email
 resource.provider = ''

现在,当我使用sign_in时,我会得到:

{“errors”:“仅限授权用户”}

在浏览器中。

EN

回答 3

Stack Overflow用户

发布于 2015-03-11 19:09:13

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

代码语言:javascript
复制
before_validation do
  self.uid = email if uid.blank?  
end

都是为了我。还要确保提供者设置为“提供者”的“电子邮件”。

票数 5
EN

Stack Overflow用户

发布于 2015-03-10 03:37:49

我现在也在为同样的事情而苦苦挣扎。尝试将devise_token_auth添加到Devise,但到目前为止对我还不起作用。

到目前为止,你是在谈论Devise的"sign_up“,还是devise_token_auth?如果是为了Devise,我想在创建记录之前设置uid=email可以解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2016-06-25 16:34:25

这个错误是由devise_token_auth引起的,而不是由devise引起的。因此,本质上,devise_token_auth正在尝试以与通常验证api请求相同的方式来验证您的正常设备路由。您的正常设计路由是通过会话进行身份验证的,而不是通过令牌进行身份验证的,因此您将收到以下错误:

代码语言:javascript
复制
{"errors":["Authorized users only."]} 

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

代码语言:javascript
复制
include DeviseTokenAuth::Concerns::SetUserByToken

另一种可能是您的routes.rb中存在一些名称空间问题。确保你有这样的东西。您需要首先使用devise_for,并正确设置token_auth的名称空间,否则将在您的其他路由上导致验证问题。

代码语言:javascript
复制
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

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28945079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档