gpt4 book ai didi

ruby-on-rails - 帖子中的真实性 token 无效

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:25 24 4
gpt4 key购买 nike

我正在使用 devise 注册/登录。

路线

get 'profile' => 'profile#get_profile'
post 'profile' => 'profile#create_profile'

profile_controller

def get_profile
render json: {user: current_user}, status: :ok
end

def create_profile
render json: {user: current_user}, status: :ok
end

获取: http://localhost:3000/user/profile返回预期的输出。然而,

POST 请求抛出错误:

ActionController::InvalidAuthenticityToken in User::ProfileController#create_profile

请揭开这种行为的神秘面纱。

最佳答案

要禁用CSRF 保护,您可以像这样编辑您的ApplicationController:

class ApplicationController < ActionController::Base
protect_from_forgery with: :null_session

# ...
end

或禁用特定 Controller 的CSRF 保护:

class ProfilesController < ApplicationController
skip_before_action :verify_authenticity_token

# ...
end

:null_session 策略清空 session 而不是引发异常这非常适合 API。因为 session 是空的,所以不能使用 current_user 方法或引用 session 的其他助手。

重要:

  • protect_from_forgery with: :null_session 必须仅在特定情况下使用例,例如允许没有 html 形式的 API 请求(POST/PUT/PATCH/DELETE)
  • 使用 protect_from_forgery with: :null_session,您必须使用授权系统限制对您的数据的访问,因为每个人都可以对您的 API 端点发出请求
  • 不要删除 protect_from_forgery with: :exception 对于通过 html 表单完成的请求,是危险的!(阅读此处 http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf)

要处理标准请求(通过 html 表单)和 API 请求,通常您必须为同一资源设置两个不同的 Controller 。示例:

路线

Rails.application.routes.draw do
resources :profiles

namespace :api do
namespace :v1 do
resources :profiles
end
end

end

应用程序 Controller

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
end

配置文件 Controller

(html 请求的标准 Controller )

# app/controllers/profiles_controller.rb
class ProfilesController < ApplicationController

# POST yoursites.com/profiles
def create
end
end

Api::V1::ProfilesController

(API 请求的 Controller )

# app/controllers/api/v1/profiles_controller.rb
module Api
module V1
class ProfilesController < ApplicationController
# To allow only json request
protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }

# POST yoursites.com/api/v1/profiles
def create
end
end
end
end

引用资料: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#method-i-protect_from_forgery

关于ruby-on-rails - 帖子中的真实性 token 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34251400/

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