gpt4 book ai didi

ruby-on-rails - Rails api gem和设计 token 认证

转载 作者:行者123 更新时间:2023-12-04 04:12:08 26 4
gpt4 key购买 nike

如果有人可以阐明一点,将不胜感激,因为我对此问题一无所知。基本上,我正在尝试使用基于rails-api gem的仅JSON的rails rest api应用程序来完成devise身份验证。

我已经实现了SessionsRegistrations处理,如下所述。

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

到目前为止一切正常。在其他 Controller 中,我添加了此行以保护它们。 before_filter :authenticate_user!,但使用auth_token调用时出现此错误。 ?auth_token = xxxxxxxxxxx
undefined method authenticate_user!
Controller
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

有人解释为什么吗?

最佳答案

步骤1.使用自定义 Controller 覆盖设计 Controller ,该自定义 Controller 将重定向替换为JSON响应。 Here's a custom SessionController that uses JSON responses

步骤2。如果发生身份验证错误,则控制权转到使用一个fail_app的warden,该应用程序仅是一个Rack应用程序,该应用程序根据请求的格式设置Flash消息并进行渲染/重定向。您需要一个带有错误键的自定义json响应,该错误键包含一个错误数组,而不是默认错误键。因此,您需要在带有this content的config/initializers下的custom_auth_failure_app.rb。

步骤4.现在,我们必须通过将其添加到config/initializers/devise.rb来告诉Devise使用自定义失败应用程序:

config.warden do |manager|
manager.failure_app = CustomAuthFailure
end

步骤5.在devise模型中启用 token_authenticatable并将以下内容添加到 config/initializers/devise.rb
config.http_authenticatable = true
config.skip_session_storage = [:http_auth, :token_auth]

第6步。如果您使用的是不使用 session 的真实JSON API,请使用带有补丁的warden版本(> 1.2.2)来处理nil session 。

还请阅读我的 blog post about creating a tested, documented and versioned JSON API using Rails4 + Rails-API + Devise,其中讨论了所有这些步骤。

关于ruby-on-rails - Rails api gem和设计 token 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16901023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com