我创建了一个ASP.NET webapi应用程序,该应用程序使用个人帐户安全性,因此在默认情况下启用承载令牌。它的工作很好,所以我可以测试他们在邮差没有问题。
当我试图通过Swashbuckle集成Swagger UI时,问题来了。我通过以下方式安装了Swashbuckle:
安装-封装Swashbuckle
然后更改swaggreconfig.cs:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.ApiKey("Token")
.Description("Filling bearer token here")
.Name("Authorization")
.In("header");
}
.EnableSwaggerUi(c =>
{
c.EnableApiKeySupport("Authorization", "header");
};
启动我的申请,填写不记名令牌:
但当我运行需要授权的api请求时,它就不起作用了。下面是截图:
将承载令牌添加到头中的授权中。但我还是得到了401号错误。我在想是不是因为令牌被编码了(空格被%20替换了)?知道吗?多谢了。
顺便说一下,我想知道如何在我的Swagger文档中添加/标记,以便我可以在Swagger UI中获得标记。
在ASP.NET framework Web API中,我能够在UI上添加承载令牌,并通过两种不同的方式使其正常工作。
添加操作Fitler。创建以下类:
public class AuthorizationHeaderParameterOperationFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters == null)
{
operation.parameters = new List<Parameter>();
}
operation.parameters.Add(new Parameter
{
name = "Authorization",
@in = "header",
description = "access token",
required = false,
type = "string",
@default = "Bearer "
});
}
}
现在在swaggerconfig.cs中添加以下内容:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
// other settings
c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
})
.EnableSwaggerUi(c =>
{
// UI configurations
});
我们也可以使用DocumentFilter来迭代所有的操作并添加头,在下面的一个中,我们跳过了实际使用username和password并首次给出令牌的操作:
public class SwaggerPathDescriptionFilter : IDocumentFilter
{
private string tokenUrlRoute = "Auth";
// the above is the action which returns token against valid credentials
private Dictionary<HeaderType, Parameter> headerDictionary;
private enum HeaderType { TokenAuth };
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
CreateHeadersDict();
var allOtherPaths = swaggerDoc.paths.Where(entry => !entry.Key.Contains(tokenUrlRoute)) //get the other paths which expose API resources and require token auth
.Select(entry => entry.Value)
.ToList();
foreach (var path in allOtherPaths)
{
AddHeadersToPath(path, HeaderType.TokenAuth);
}
}
/// <summary>
/// Adds the desired header descriptions to the path's parameter list
/// </summary>
private void AddHeadersToPath(PathItem path, params HeaderType[] headerTypes)
{
if (path.parameters != null)
{
path.parameters.Clear();
}
else
{
path.parameters = new List<Parameter>();
}
foreach (var type in headerTypes)
{
path.parameters.Add(headerDictionary[type]);
}
}
/// <summary>
/// Creates a dictionary containin all header descriptions
/// </summary>
private void CreateHeadersDict()
{
headerDictionary = new Dictionary<HeaderType, Parameter>();
headerDictionary.Add(HeaderType.TokenAuth, new Parameter() //token auth header
{
name = "Authorization",
@in = "header",
type = "string",
description = "Token Auth.",
required = true,
@default = "Bearer "
});
}
}
然后我们需要在swaggerconfig.cs:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
// other settings
c.DocumentFilter<SwaggerPathDescriptionFilter>();
})
.EnableSwaggerUi(c =>
{
// UI configurations
});
现在我们将在swagger UI中看到标题的令牌输入,如下所示:
下面详述的问题现在在SwashBuckle5.5.0中得到了解决。
碰上了同样的问题。我认为根本原因是Swashbuckle源代码中的这一行:
var key = encodeURIComponent($('#input_apiKey')[0].value);
这是来自HTML输入字段的值通过URL编码将空格转换为%20
的地方。我正计划在GitHub上开一个虚张声势的回购发行。
在这个问题得到解决之前,这里有一个解决方法,使用注入到Swagger UI中的Javascript文件替换上面的行:
>
在您安装了Swashbuckle的项目中,创建一个新文件夹并将其称为“Swagger”。
在new文件夹中创建一个名为“swaggeruicustoMization.js”的新Javascript文件,并将此脚本放入其中:
(function () {
function addApiKeyAuthorization() {
var key = $('#input_apiKey')[0].value;
if (key && key.trim() != "") {
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(swashbuckleConfig.apiKeyName, key, swashbuckleConfig.apiKeyIn);
window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
log("added key " + key);
}
}
$('#input_apiKey').change(addApiKeyAuthorization);
})();
在“解决方案资源管理器”中,选择该文件并单击Alt+Enter编辑其属性。在Properties窗口中,将文件的生成操作更改为Embedded Resource。
在您的swaggerconfig.cs文件中,在enableswaggerui()
代码块中添加以下行:c.injectJavaScript(thisAssembly,“
当然,请确保将
替换为项目的默认命名空间。
运行您的项目并在文本框中输入“承载”。当您调用控制器操作时,您应该在服务器端获得这个完全相同的值--使用空格,而不是%20%
。
swagger-config.yaml app.js
我在做概念验证。我正在使用Azure Active Directory并试图在遗留项目中实现OAuth。 这个项目的一半使用Web表单,另一半直接通过JavaScript在另一个项目中调用WebAPI。 作为一个测试,我通过UseOpenIDConnectauthEntication的AuthorizationCodeReceed通知事件获得承载令牌。我使用以下代码将令牌快速写入调用WebAPI的
我有一个Java EE8应用程序,在该应用程序中,我使用OpenAPI注释来定义RESTendpoint,并自动生成一个昂首阔步的UI。对于身份验证,我使用JSON Web令牌(JWT)。 当我从邮递员发送请求时,一切都很好,但是,我不知道如何在我的昂首阔步的UI中添加一个承载令牌的字段。 我使用注释定义我的安全方案: 我尝试将此方案作为添加到资源的注释中,并直接添加到方法中。 因此,我现在在Op
我有一个REST API服务提供者,用PHP编写。我在《邮递员》中成功地测试了它,它在那里工作正常。 现在我要为它准备API留档,我正在使用Swagger UI 3。我正确地设置了它,我可以用顶部的授权按钮处理授权。 成功登录后,我希望endpoint设置并使用相应的承载令牌。但这不会发生,当我尝试任何endpoint时,REST服务器都会抱怨缺少授权头。我测试了网络流量,HTTP请求中没有令牌。
我的任务是在swagger-ui站点中启用授权按钮。我做了REST-Controller的留档,带有来自springdoc-openapi-ui-依赖项的@操作或@Api响应等注释。现在我应该在昂首阔步的表面启用授权按钮。 我有以下介绍:https://www.baeldung.com/spring-boot-swagger-jwt但在这里我必须包括springfox到我的maven依赖,但当我这
我正在使用Spring Boot构建一个REST API。我添加了Swagger-ui来处理文档。我在实现客户机身份验证流到swagger时遇到了一个问题,问题是我可以通过基本auth让swagger-ui授权提供的客户机ID(用户名)和客户机机密(密码),但swagger UI似乎没有应用到endpoint调用的结果访问令牌。 确认,我的授权过程;-使用basic auth将base64编码的用