首页 > 解决方案 > sinatra-cors 在使用中间件时没有响应 200

问题描述

我正在为自己的好奇心编写一个小应用程序,并且遇到了 sinatra-cors gem 没有响应 200 的问题。这导致 Chrome 无法选择选项请求(并且随后无法完成页面上的内容)。

Private我在控制器和控制器中都有以下设置Public。控制器处理不需要身份验证的Public路由(例如登录),Private控制器处理需要通过 JWT 进行身份验证的路由。

Public控制器中,我有:

    enable :cross_origin
  end

  before do
    response.headers['Access-Control-Allow-Origin'] = '*'
  end

  # routes...
  options '*' do
    response.headers['Allow'] = 'GET, PUT, POST, DELETE, OPTIONS'
    response.headers['Access-Control-Allow-Headers'] = 'Authorization, X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept'
    response.headers['Access-Control-Allow-Origin'] = '*'
    200
  end 

由于CORS 设置为允许所有域paths,因此Public控制器中的 200 对其选项请求正确返回。即使在控制器中指定了相同的 cors 配置,控制器中的 500 也会失败pathsPrivate

不同之处在于控制器在控制器的开头Private有一个语句,这是我为使用令牌定义的。当我删除它时,控制器成功传递了选项请求。use JwtAuthmiddlewareJWT

JWT middleware如下:


require 'json'
require 'jwt'

class JwtAuth
  CONTENT_TYPE = { 'Content-Type' => 'text/plain' }.freeze

  def initialize(app)
    @app = app
  end

  # rubocop:disable Metrics/MethodLength
  def call(env)
    options = { algorithm: 'HS256', iss: 'Jade-Liberty-Backend' }
    bearer = env.fetch('HTTP_AUTHORIZATION', '').slice(7..-1)
    payload, _header = JWT.decode(bearer, 'thereisnospoon', true, options)

    env[:scopes] = payload['scopes']
    env[:user] = payload['user']

    @app.call env
  rescue JWT::DecodeError
    [401, CONTENT_TYPE, [Errors::INVALID_TOKEN]]
  rescue JWT::ExpiredSignature
    [403, CONTENT_TYPE, [Errors::TOKEN_EXPIRED]]
  rescue JWT::InvalidIssuerError
    [403, CONTENT_TYPE, [Errors::INVALID_ISSUER]]
  rescue JWT::InvalidIatError
    [403, CONTENT_TYPE, [Errors::INVALID_ISSUED_AT]]
  rescue e
    [500, CONTENT_TYPE, [Errors::INTERNAL_SERVER_ERROR]]
  end
  # rubocop:enable Metrics/MethodLength
end

我按照以下内容创建中间件:https ://auth0.com/blog/ruby-authentication-secure-rack-apps-with-jwt/

我不确定为什么添加中间件会导致选项请求失败。

标签: rubyjwtsinatrarack

解决方案


该问题与我的中间件中的错误有关(错误模块未包含在源中,并且 Rack 的默认配置导致错误不显示)


推荐阅读