Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby sinatra cors在使用中间件时未响应200_Ruby_Jwt_Sinatra_Rack - Fatal编程技术网

Ruby sinatra cors在使用中间件时未响应200

Ruby sinatra cors在使用中间件时未响应200,ruby,jwt,sinatra,rack,Ruby,Jwt,Sinatra,Rack,出于好奇,我正在编写一个小应用程序,但sinatra cors gem无法响应200。这导致Chrome无法通过选项请求(随后无法完成页面上的内容) 我在Private控制器和Public控制器中都有以下设置。Public控制器处理不需要身份验证的路由(例如登录),而Private控制器处理需要通过JWT进行身份验证的路由 在公共控制器中,我有: enable :cross_origin end before do response.headers['Access-Co

出于好奇,我正在编写一个小应用程序,但sinatra cors gem无法响应200。这导致Chrome无法通过选项请求(随后无法完成页面上的内容)

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

公共
控制器中,我有:

    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 

公共
控制器中的
路径
为其选项请求正确返回200,因为CORS设置为允许所有域。
专用
控制器中的
路径
以500失败,即使在控制器中指定了相同的cors配置

不同之处在于,
Private
控制器在控制器的开头有一个
use JwtAuth
语句,这是我为使用
JWT
令牌定义的
中间件。当我删除此选项时,控制器会成功地传递选项请求

JWT中间件
JWT
如下所示:


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
我按照以下步骤创建中间件:


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

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

rescue JWT::ExpiredSignature必须在rescue JWT::DecodeError之前出现,否则JWT::DecodeError将捕获过期的令牌