devise_token_auth更新请求

时间:2016-01-14 00:49:13

标签: ruby-on-rails devise httprequest

您好我正在使用devise_auth_token gem,并根据此指示使用邮递员对/的PUT请求测试我的服务器:

  

帐户更新。此路线将更新现有用户的帐户   设置。默认接受的参数是密码和   password_confirmation,但可以使用   devise_parameter_sanitizer系统。如果   config.check_current_password_before_update设置为:attributes   如果设置为,则在任何更新之前检查current_password param   :password仅在请求时检查current_password参数   更新用户密码。

我发了这个请求 - >

标题:

"access-token": "wwwww",
"token-type":   "Bearer",
"client":       "xxxxx",
"expiry":       "yyyyy",
"uid":          "zzzzz"

身体:

{  
  "name": "MI NOMBRE",
  "nickname": "MI APODO",
  "role": "MI ROL"
}

我收到此错误:Please submit proper account update data in request body.

这是我在application_controller.rb中的授权参数:

protect_from_forgery with: :null_session
before_filter :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :password_confirmation
    devise_parameter_sanitizer.for(:account_update) do |user_params|
      user_params.permit(:role, :email, :nickname, :name, :password, :password_confirmation)
    end
  end

我的服务器消息:

Processing by DeviseTokenAuth::RegistrationsController#update as */*
Can't verify CSRF token authenticity
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."uid" = ? LIMIT 1  [["uid", "test2@gmail.com"]]
Filter chain halted as :validate_account_update_params rendered or redirected
Completed 422 Unprocessable Entity in 85ms (Views: 0.2ms | ActiveRecord: 0.5ms)

2 个答案:

答案 0 :(得分:1)

如果您在本地计算机上进行测试,您可能需要首先允许跨站点请求。更新您的Gemfile并运行bundle install

group :development do
  gem 'rack-cors'
end

config/environments/development.rb中添加以下内容:

  config.middleware.insert_before 0, Rack::Cors do
    # allow all origins in development
    allow do
      origins '*'
      resource '*',
          :headers => :any,
          :methods => [:get, :post, :delete, :put, :options],
          :expose  => ['access-token', 'expiry', 'token-type', 'uid', 'client'],
          :max_age => 0
    end
  end

然后在客户端,您可以使用多个库。所有这些都将auth-token存储在客户端(cookie,会话存储,...),然后将令牌注入每个请求。根据您的堆栈,您可以选择:

基本上验证看起来像这样(来自ng-token-auth的图像):

ng-token-auth flow

当客户端HTML在服务器(Rails)上呈现时,通常的做法是在页面布局中的某处包含CSRF标记:

<%= csrf_meta_tag %>

如果你真的想用postman做这件事,让我们说你只有JSON API,你可以在application_controller.rb中设置令牌:

before_action :set_token
def set_token
  response.headers['X-XSRF-TOKEN'] = form_authenticity_token
end

现在当您发送GET /时,您将能够检索

X-XSRF-TOKEN: Tjbsg1RYL6bBoCK1u1As8/SO09V+vZ+IOyfNrRXdyfNb9DeWjwnArv6IZkyr2+ayMchwywXPyausYOQhWNGK1g==
来自响应标头的

。然后,您必须使用它来提交PUT请求。这仅仅是为了说明这是如何工作的,使用一些库来管理令牌是一个更好的主意。

答案 1 :(得分:1)

在使用gem'rack-cors'设置跨站点请求后,如果有人正在寻找解决方案。

application_controller.rb中添加以下内容:

before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :password_confirmation])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :nickname, :image])
  end

经过测试并在Rails 5.2.1中工作