web-dev-qa-db-fra.com

Comment utiliser Swagger dans ASP.Net Web API 2.0 avec une authentification basée sur des jetons

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.

11
alaa_sayegh

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:

enter image description here

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:

enter image description here

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

31
alaa_sayegh