gpt4 book ai didi

ruby-on-rails - Rails Set-Cookie on json API 响应

转载 作者:行者123 更新时间:2023-12-03 15:30:20 25 4
gpt4 key购买 nike

简单的基于 token 的 Rails 身份验证。
客户端服务器向 API 服务器发出请求。 API 服务器返回成功状态、json 编码的正文并理想地设置 cookie。

# response from API  
render json: {user: "user", token: "token_string"}, status: :created

此响应如何还设置 cookie?
我试图附加 , set_cookie: token到渲染语句。我也 skip_before_filter :verify_authenticity_token, only: :create
最终目标是将 token 存储在浏览器 cookie 中。我不想为 token 使用 HTML5 存储。

最佳答案

这是我的跨域 SPA/API 设置:

我在我的 Controller 中有这个,使用 Knock gem, Action :

class AccountTokenController < Knock::AuthTokenController
def create
response.set_cookie(
:jwt,
{
value: auth_token.token,
expires: 30.minutes.from_now,
path: '/api',
secure: Rails.env.production?,
httponly: Rails.env.production?
}
)

render json: auth_token.payload, status: :created
end
end

这将在客户端上设置一个 cookie,并在响应正文中返回所有 token 数据,包括一个 CSRF token 。

您还需要确保您的 AJAX 请求包含 cookie,默认情况下它们不包含。使用 Axios,您可以通过设置选项 withCredentials: true 来做到这一点。 .对于其他库,它会是类似的。

CORS

如果您在 API 服务器上配置了 CORS,并且您应该这样做,那么您还需要一些额外的配置。我使用 Rack::CORS这个 gem 和我的配置看起来像这样(config/initializers/cors.rb):
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins 'http://localhost:3001'
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head],
credentials: true
end
end

注意 credentials: true 的配置以及需要在 origins下指定特定主机, 都不是 *在这种情况下,域列表也不起作用。

CSRF 和 XSS

基本上跨站点请求伪造是当另一个域假设您的用户已登录并具有 session cookie 时向您的后端发出请求。因此它基于 cookie 并来自第三方域,因此无法访问您浏览器中的任何内容。

XSS,跨站点脚本是指有人设法在您的页面上运行脚本,从而在您的域上运行脚本。这种攻击可以访问您浏览器中该域的任何内容。这包括 sessionStorage 和 localStorage 以及浏览器可以读取的普通 cookie。

为什么这有效

CSRF token 出现在 session cookie 中,并作为 header 与每个 API 请求一起发送,在保持后端无状态的同时提供对 CORS 和 XSS 的保护。

任何后端服务所要做的就是:
  • 验证 JWT 签名(以确保返回的不是伪造或操纵的 session cookie)。
  • 验证 exp避免 JWT 重放的部分。
  • 将 header CSRF token 与 JWT 中的 token 进行比较。
  • 验证 JWT 中的范围(这将特定于应用程序)。

  • 完整的 JWT 在用作 cookie 之前使用服务器私钥进行签名,因此无法在没有检测的情况下进行操作。

    因此,任何 CSRF 攻击都会失败,因为它只能间接访问 session cookie,并且无法从中读取 CSRF token ,因此任何请求都会失败。

    任何 XSS 攻击都会失败,因为即使他们可以读取 localStorage 中的 CSRF token ,他们也无法获取 session cookie。做到这一点的唯一方法是从您的浏览器 session 对后端运行请求,虽然这可能是可能的,但这通常不是这些攻击的工作方式。他们通常会尝试导出 session 信息,以便他们可以从另一台服务器发出请求,但这在这里不起作用。

    关于ruby-on-rails - Rails Set-Cookie on json API 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354273/

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