ruby - 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 也会失败paths
。Private
不同之处在于控制器在控制器的开头Private
有一个语句,这是我为使用令牌定义的。当我删除它时,控制器成功传递了选项请求。use JwtAuth
middleware
JWT
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/
我不确定为什么添加中间件会导致选项请求失败。
解决方案
该问题与我的中间件中的错误有关(错误模块未包含在源中,并且 Rack 的默认配置导致错误不显示)
推荐阅读
- java - Jhipster 使用 Websocket 和 Vue 构建,不进行身份验证或登录
- php - 如何区分 Octobercms 后端表单中的关系
- postgresql - 如何在 Postgresql 的选择中重新映射数组列值?
- scala - 根据spark scala中完整df的列值设置列值
- vue.js - 当vue router-link完成导航时如何运行回调
- xml - 什么 .NET 类和方法可用于替换 XML 中的单引号和双引号以及其他特殊字符?
- python - 如何使用 tkinter 制作带有框架的标签?
- tensorflow - TensorFlow Object Detection API 量化,输出张量为 TFLite_Detection_PostProcess
- scala - 来自非 Spark API 的日志从数据集/数据帧迭代内部调用中被吃掉
- asp.net-core-mvc - 如何上传CK-Editor .net core mvc的图片