gpt4 book ai didi

c# - .Net Core Swashbuckle 在重定向时跳过授权 header

转载 作者:行者123 更新时间:2023-12-04 17:35:56 36 4
gpt4 key购买 nike

在 .Net Core Web API 中,我使用 Swashbuckle 集成了 Swagger。 API 受到保护,因此在 Swagger UI 中执行某些请求之前需要授权和登录。这一切都很好。

现在,一个 API 调用会创建一个预签名 URL 并将 HTTP 重定向返回到文件服务器(预签名 URL)。

问题在于 Swagger UI 将带有 JWT token 的授权 header 发送到文件服务器 (MinIO)。这导致文件服务器接收两种不同的身份验证机制并以无效请求响应。

有没有办法影响 Swagger UI 如何处理重定向或不在重定向时发送 token ?

最佳答案

我也遇到了这个问题,并意识到当 fetch 重定向到预签名的 S3 URL 时,您无法阻止它从您的 API 发送授权 header 。

最终,我能够通过使用 Swagger 的 responseInterceptor 配置参数和自定义函数来实现此功能,该函数检测来自 S3 的错误请求 (400) 响应,然后重新发出 使用 credentials: 'omit' 获取 请求。

这是我为 Swagger 定制的响应拦截器:

// swagger-ui-extensions.js

function serializeHeaderValue(value) {
const isMulti = value.includes(', ');
return isMulti ? value.split(', ') : value;
}

function serializeHeaders(headers = {}) {
return Array.from(headers.entries()).reduce((acc, [header, value]) => {
acc[header] = serializeHeaderValue(value);
return acc;
}, {});
}

function myResponseInterceptor(response) {
// NOTE: Additional checks should probably be added whether to re-issue the fetch. This was just an initial starting point.
if (response.ok === false && response.status === 400 && response.headers['server'] === 'AmazonS3') {
// Here is the important part, re-issue fetch but don't allow our Authentication header to flow
response = fetch(response.url, { credentials: 'omit' })
.then(nativeResponse => {
// We can't return the native response because Swagger UI attempts to assign the header property (and potentially other properties
// too) on the response. So return a serialized clone of the native response. FYI, this is the same exact logic from Swagger's fake
// implementation of fetch.
const getBody = nativeResponse.blob || nativeResponse.buffer;
return getBody.call(nativeResponse).then(body => {
return {
ok: nativeResponse.ok,
url: nativeResponse.url,
status: nativeResponse.status,
statusText: nativeResponse.statusText,
headers: serializeHeaders(nativeResponse.headers),
data: body
};
});
});
}
return response;
}

然后在 index.html

中初始化 Swagger UI 时,我必须指定我的自定义 myResponseInterceptor
      // (other code omitted for brevity...)

// Make sure to include your custom JS in the page
// <script src="./swagger-ui-extensions.js"></script>

// Specifying the custom responseInterceptor here...
configObject.responseInterceptor = myResponseInterceptor;

// Begin Swagger UI call region

const ui = SwaggerUIBundle(configObject);

ui.initOAuth(oauthConfigObject);

// End Swagger UI call region

window.ui = ui;

我正在使用 ASP.NET Core 并使用这些说明为 Swagger UI 提供我自己的 index.html: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#customize-indexhtml

毕竟,这出人意料地奏效了,我能够在 Swagger 中看到来自 S3 的重定向响应。

关于c# - .Net Core Swashbuckle 在重定向时跳过授权 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56575552/

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