Saltar al contenido

Interfaz de usuario de Swagger: pase el encabezado de autorización personalizado

Nuestro team de trabajo ha pasado horas buscando para dar solución a tu búsqueda, te regalamos la respuesta por eso deseamos servirte de mucha apoyo.

Solución:

Nos encontramos con el mismo problema en nuestro proyecto. También quería agregar los parámetros del encabezado al sitio web de la interfaz de usuario de Swagger. Así es como lo hicimos:

1. Definir una clase OperationFilter
OperationFilters se ejecuta en cada operación de API cada vez que crea Swagger. Según su código, las operaciones se verificarán de acuerdo con sus filtros. En este ejemplo, hacemos que el parámetro de encabezado sea obligatorio en todas las operaciones, pero lo hacemos opcional en las operaciones que tienen el parámetro AllowAnonymous. attribute.

public class AddAuthorizationHeader : IOperationFilter

    /// 
    /// Adds an authorization header to the given operation in Swagger.
    /// 
    /// The Swashbuckle operation.
    /// The Swashbuckle schema registry.
    /// The Swashbuckle api description.
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    
        if (operation == null) return;

        if (operation.parameters == null)
        
            operation.parameters = new List();
        

        var parameter = new Parameter
        
            description = "The authorization token",
            @in = "header",
            name = "Authorization",
            required = true,
            type = "string"
        ;

        if (apiDescription.ActionDescriptor.GetCustomAttributes().Any())
        
            parameter.required = false;
        

        operation.parameters.Add(parameter);
    

2. Dígale a Swagger que use este OperationFilter
En SwaggerConfig, solo agregue que el filtro de operación debe usarse de la siguiente manera:

c.OperationFilter();

¡Espero que esto te ayude!

Cree un nuevo filtro de operaciones que implemente IOperationFilter.

public class AuthorizationHeaderOperationFilter : IOperationFilter

    /// 
    /// Adds an authorization header to the given operation in Swagger.
    /// 
    /// The Swashbuckle operation.
    /// The Swashbuckle operation filter context.
    public void Apply(Operation operation, OperationFilterContext context)
    
        if (operation.Parameters == null)
        
            operation.Parameters = new List();
        

        var authorizeAttributes = context.ApiDescription
            .ControllerAttributes()
            .Union(context.ApiDescription.ActionAttributes())
            .OfType();
        var allowAnonymousAttributes = context.ApiDescription.ActionAttributes().OfType();

        if (!authorizeAttributes.Any() && !allowAnonymousAttributes.Any())
        
            return;
        

        var parameter = new NonBodyParameter
        
            Name = "Authorization",
            In = "header",
            Description = "The bearer token",
            Required = true,
            Type = "string"
        ;

        operation.Parameters.Add(parameter);
    

Configura el servicio en tu Startup.cs expediente.

        services.ConfigureSwaggerGen(options =>
        
            options.OperationFilter();
        );

Podrías hacerlo de diferentes maneras dependiendo de cómo recolectes el Authorization encabezado y si desea que el código maneje todo o si desea que el usuario pueda ingresar lo que sea Authorization encabezado que quieren.

Cuando probé esto por primera vez, pude mostrar un Authorization texto de encabezado en el área de campo de parámetro de cada punto final donde un usuario podría escribir un Authorization encabezado pero eso no era lo que quería.

En mi situación, tuve que enviar una solicitud a la /token punto final con la cookie del usuario para obtener una válida Authorization simbólico. Así que hice una combinación de cosas para lograr esto.

Primero en SwaggerConfig.cs yo descomentaba c.BasicAuth() para obtener el esquema de autenticación básico en el esquema API y también inyecté un index.html página donde inserté una solicitud AJAX para obtener el Authorization token, utilizando la cookie del usuario (index.html código que se muestra a continuación):

public static void Register() 

    System.Reflection.Assembly thisAssembly = typeof(SwaggerConfig).Assembly;

    System.Web.Http.GlobalConfiguration.Configuration
                .EnableSwagger(c => 
                    ...

                    c.BasicAuth("basic").Description("Bearer Token Authentication");

                    ...
                )
                .EnableSwaggerUi(c => 
                    ...

                    c.CustomAsset("index", thisAssembly, "YourNamespace.index.html");

                    ...
                );

Entonces dirígete aquí para descargar el swashbuckle index.html que personalizaremos para insertar un Authorization encabezamiento.

A continuación, simplemente hago una llamada AJAX a mi /token endpoint con una cookie válida, obtenga el Authorization token, y dáselo a swagger para que lo use con window.swaggerUi.api.clientAuthorizations.add():

...

function log() 
  if ('console' in window) 
    console.log.apply(console, arguments);
  


$.ajax(
    url: url + 'token'
  , type: 'POST'
  , data:  'grant_type': 'CustomCookie' 
  , contentType: 'application/x-www-form-urlencoded'
  , async: true
  , timeout: 60000
  , cache: false
  , success: function(response) 
        console.log('Token: ' + response['token_type'] + ' ' + response['access_token']);
        window.swaggerUi.api.clientAuthorizations.add("key", new SwaggerClient.ApiKeyAuthorization("Authorization", response['token_type'] + ' ' + response['access_token'], "header"));
    
  , error: function(request, status, error) 
        console.log('Status: ' + status + '. Error: ' + error + '.');
    
);

Eliminé algunas cosas de la llamada AJAX para hacerlo más simple y, obviamente, su implementación probablemente será diferente dependiendo de cómo recopile su Authorization token y esas cosas, pero eso te da una idea. Si tiene algún problema o pregunta específica, hágamelo saber.

*Editar: no me di cuenta de que realmente quería que el usuario escribiera su Authorization encabezamiento. En ese caso es muy fácil. Usé esta publicación. Simplemente creó la siguiente clase para hacer el trabajo:

public class AddRequiredHeaderParameter : IOperationFilter 

    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
        if (operation.parameters == null) 
            operation.parameters = new List();
        

        operation.parameters.Add(new Parameter 
            name = "Foo-Header",
            @in = "header",
            type = "string",
            required = true
        );
    

Luego agregué la clase a mi SwaggerConfig al igual que:

...
c.OperationFilter();
...

Agradecemos que desees corroborar nuestra misión ejecutando un comentario y dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *