【发布时间】:2013-05-29 20:33:45
【问题描述】:
如果有人可以提供一些启示,我将不胜感激,因为我对这个问题有点无能为力。基本上,我正在尝试使用构建在rails-api gem 之上的仅 JSON rails rest api 应用程序来完成设计身份验证。
我已经实现了Sessions 和Registrations 处理,如下所述。
class ApplicationController < ActionController::API
include ActionController::MimeResponds
end
sessions_controller.rb
class SessionsController < Devise::SessionsController
prepend_before_filter :require_no_authentication, :only => [:create ]
before_filter :ensure_params_exist
def create
build_resource
resource = User.find_for_database_authentication(:email => params[:user][:email])
return invalid_login_attempt unless resource
if resource.valid_password?(params[:user][:password])
sign_in("user", resource)
render :json=> {:success=>true, :auth_token=>resource.authentication_token, :email=>resource.email}
return
end
invalid_login_attempt
end
def destroy
sign_out(resource_name)
end
protected
def ensure_params_exist
return unless params[:user][:email].blank?
render :json=>{:success=>false, :message=>"missing login email parameter"}, :status=>422
end
def invalid_login_attempt
warden.custom_failure!
render :json=> {:success=>false, :message=>"Error with your login or password"}, :status=>401
end
end
registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
skip_before_filter :verify_authenticity_token, :only => :create
def create
user = User.new(params[:user])
if user.save
render :json=> {:user => [:email => user.email, :auth_token => user.authentication_token]}, :status => 201
return
else
warden.custom_failure!
render :json=> user.errors, :status=>422
end
end
end
到目前为止一切正常。在我的其他控制器中,我添加了这条线来保护它们。 before_filter :authenticate_user! 但使用 auth_token 调用时出现此错误。 ?auth_token=xxxxxxxxxxx
undefined method authenticate_user!
class RestaurantsController < ApplicationController
before_filter :authenticate_user!
def index
@restaurants = Restaurant.all
end
def show
@restaurant = Restaurant.find(params[:id])
end
end
仍然不确定这里可能是什么问题 - 我假设这是因为使用 ActionController::API 时缺少正确设计的东西
更新
看来问题出在我的routes.rb 本身 - 这就是路线的完成方式。
require 'api_constraints'
MyApi::Application.routes.draw do
namespace :api, defaults: {format: 'json'} do
scope module: :v1, constraints: ApiConstraints.new(version: 1,default: true) do
devise_for :users
resources :friends
resources :locations
resources :profiles
resources :users
end
scope module: :v2, constraints: ApiConstraints.new(version: 2) do
# Future releases of the API can go here
end
end
end
现在如果在范围之外重复devise_for :users,一切都开始工作了。
require 'api_constraints'
MyApi::Application.routes.draw do
namespace :api, defaults: {format: 'json'} do
scope module: :v1, constraints: ApiConstraints.new(version: 1,default: true) do
devise_for :users
resources :friends
resources :locations
resources :profiles
resources :users
end
scope module: :v2, constraints: ApiConstraints.new(version: 2) do
# Future releases of the API can go here
end
end
devise_for :users
end
有人解释为什么吗?
【问题讨论】:
-
问题已更新 - 添加路线。
-
您的问题如此太好了,我用它来修复我自己的代码。我希望你现在已经找到了解决方案:)
标签: ruby-on-rails devise rails-api