J'ai un ASP.Net WebApi avec authentification basée sur des jetons et je veux utiliser un swagger pour créer la documentation de ce RestApi.
L'API n'a pour l'instant que 2 méthodes, une pour demander un token, c'est-à-dire http://localhost:4040/token
et l'autre sert à créer une notification. Le jeton porteur retourné est envoyé comme suit:
using (var client = new HttpClient())
{
// setup client
client.BaseAddress = new Uri("http://localhost:4040");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var serializedNotification = new JavaScriptSerializer().Serialize(notification);
var stringContent = new StringContent(serializedNotification, Encoding.UTF8, "application/json");
var response = await client.PostAsync("api/Notification", stringContent);
response.EnsureSuccessStatusCode();
// return URI of the created resource.
return response.Headers.Location;
}
Avec swagger, je peux voir la méthode post-notification, mais je ne peux pas faire de demande car je n'ai pas de jeton et je ne sais pas comment le faire dans swagger.
J'ai trouvé la solution moi-même. Je voudrais le partager au cas où quelqu'un serait confronté au même problème. La solution est de 2 étapes, la première consiste à demander un jeton et l'étape suivante, est d'ajouter le jeton dans la demande d'en-tête.
Donc la première étape:
Personnalisez le frontend pour activer la post-demande pour demander un jeton:
Ajoutez une classe AuthTokenOperation
à activer qui hérite de l'interface IDcoumentFilter
et implémente la méthode Apply:
public class AuthTokenOperation : IDocumentFilter
{
/// <summary>
/// Apply custom operation.
/// </summary>
/// <param name="swaggerDoc">The swagger document.</param>
/// <param name="schemaRegistry">The schema registry.</param>
/// <param name="apiExplorer">The api Explorer.</param>
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
swaggerDoc.paths.Add("/token", new PathItem
{
post = new Operation
{
tags = new List<string> { "Auth"},
consumes = new List<string>
{
"application/x-www-form-urlencoded"
},
parameters = new List<Parameter>
{
new Parameter
{
type = "string",
name = "grant_type",
required = true,
@in = "formData"
},
new Parameter
{
type = "string",
name = "username",
required = false,
@in = "formData"
},
new Parameter
{
type = "string",
name = "password",
required = false,
@in = "formData"
},
}
}
});
}
}
Et dans la classe SwaggerConfig de la méthode register, ajoutez cette action
c.DocumentFilter<AuthTokenOperation>();
à la méthode d'extension:
GlobalConfiguration.Configuration.EnableSwagger
Pour ajouter le jeton d'autorisation dans l'en-tête de la demande:
Ajoutez cette classe d'opération:
/// <summary>
/// The class to add the authorization header.
/// </summary>
public class AddAuthorizationHeaderParameterOperationFilter : IOperationFilter
{
/// <summary>
/// Applies the operation filter.
/// </summary>
/// <param name="operation"></param>
/// <param name="schemaRegistry"></param>
/// <param name="apiDescription"></param>
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters != null)
{
operation.parameters.Add(new Parameter
{
name = "Authorization",
@in = "header",
description = "access token",
required = false,
type = "string"
});
}
}
}
Et dans la classe SwaggerConfig de la méthode register, ajoutez cette action
c.OperationFilter<AddAuthorizationHeaderParameterOperationFilter>();
à la méthode d'extension:
GlobalConfiguration.Configuration.EnableSwagger
Bien sûr, dans le champ Authoization, vous devez ajouter: Bearer token_string