.Net Core Swashbuckle 跳过重定向授权 header
.Net Core Swashbuckle skip authorization header on redirects
在 .Net Core 网络中 API 我使用 Swashbuckle 集成了 Swagger。 API 受到保护,因此在 Swagger UI 中执行某些请求之前需要授权和登录。这一切都很好。
现在一个 API 调用会创建一个预签名的 URL 和 returns 到文件服务器的 HTTP 重定向(预签名的 URL)。
问题是 Swagger UI 将带有 JWT 令牌的授权 header 发送到文件服务器 (MinIO)。这会导致文件服务器接收两种不同的身份验证机制并以无效请求响应。
有没有办法影响 Swagger UI 处理重定向或不在重定向上发送令牌的方式?
我也遇到了这个问题并意识到当 fetch
重定向到预签名的 S3 URL 你无法阻止它从你的 [=34] 发送授权 headers =].
最终,我能够通过使用 Swagger 的 responseInterceptor
配置参数和自定义函数来实现此功能,该函数检测来自 S3 的错误请求 (400) 响应,然后 re-issues fetch
请求 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 的重定向响应。
在 .Net Core 网络中 API 我使用 Swashbuckle 集成了 Swagger。 API 受到保护,因此在 Swagger UI 中执行某些请求之前需要授权和登录。这一切都很好。
现在一个 API 调用会创建一个预签名的 URL 和 returns 到文件服务器的 HTTP 重定向(预签名的 URL)。
问题是 Swagger UI 将带有 JWT 令牌的授权 header 发送到文件服务器 (MinIO)。这会导致文件服务器接收两种不同的身份验证机制并以无效请求响应。
有没有办法影响 Swagger UI 处理重定向或不在重定向上发送令牌的方式?
我也遇到了这个问题并意识到当 fetch
重定向到预签名的 S3 URL 你无法阻止它从你的 [=34] 发送授权 headers =].
最终,我能够通过使用 Swagger 的 responseInterceptor
配置参数和自定义函数来实现此功能,该函数检测来自 S3 的错误请求 (400) 响应,然后 re-issues fetch
请求 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
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 的重定向响应。