175 votes

Configuration de Swagger (ASP.NET Core) à l'aide des en-têtes d'autorisation (Bearer)

J'ai une API Web (ASP.NET Core) et j'essaie d'ajuster le swagger pour faire les appels à partir de celle-ci. Les appels doivent contenir l'en-tête Authorization et j'utilise l'authentification Bearer. Les appels provenant d'applications tierces comme Postman, etc. se déroulent bien. Mais j'ai un problème avec la configuration des en-têtes pour swagger (pour une raison quelconque, je ne reçois pas les en-têtes). Voici à quoi cela ressemble maintenant :

  "host": "localhost:50352",
  "basePath": "/" ,
  "schemes": [
    "http",
    "https"
  ],
 "securityDefinitions":  {
    "Bearer": {
      "name": "Authorization",
      "in": "header",
      "type": "apiKey",
      "description": "HTTP/HTTPS Bearer"
    }
  },
  "paths": { 
    "/v1/{subAccountId}/test1": {
      "post": {
        "tags": [
          "auth"
        ],
        "operationId": "op1",
        "consumes": ["application/json", "application/html"],
        "produces": ["application/json", "application/html"],
        "parameters": [
          {
            "name": "subAccountId",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "security":[{
          "Bearer": []
        }],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "400": {
            "description": "BadRequest",
            "schema": {
              "$ref": "#/definitions/ErrorResponse"
            }
          },
          "401": {
            "description": "Unauthorized",
            "schema": {
              "$ref": "#/definitions/ErrorResponse"
            }
          },
          "500": {
            "description": "InternalServerError",
            "schema": {
              "$ref": "#/definitions/ErrorResponse"
            }
          }
        },
        "deprecated": false
      }
    },

0 votes

Je l'ai fait avec firebase stackoverflow.com/questions/61540706/

266voto

Alex Points 2064

ApiKeyScheme a été déprécié, dans la version 5 vous pouvez utiliser comme ceci :

services.AddSwaggerGen(c =>
  {
    c.SwaggerDoc("v1", new Info { Title = "You api title", Version = "v1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
      {
        Description = @"JWT Authorization header using the Bearer scheme. \r\n\r\n 
                      Enter 'Bearer' [space] and then your token in the text input below.
                      \r\n\r\nExample: 'Bearer 12345abcdef'",
         Name = "Authorization",
         In = ParameterLocation.Header,
         Type = SecuritySchemeType.ApiKey,
         Scheme = "Bearer"
       });

    c.AddSecurityRequirement(new OpenApiSecurityRequirement()
      {
        {
          new OpenApiSecurityScheme
          {
            Reference = new OpenApiReference
              {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
              },
              Scheme = "oauth2",
              Name = "Bearer",
              In = ParameterLocation.Header,

            },
            new List<string>()
          }
        });
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    c.IncludeXmlComments(xmlPath);
});

149voto

Vadim K Points 1008

Tout d'abord, vous pouvez utiliser Swashbuckle.AspNetCore paquet nuget pour la génération automatique de votre définition swagger. (testé sur 2.3.0)

Après avoir installé le package, configurez-le dans Startup.cs dans la méthode ConfigureServices

services.AddSwaggerGen(c => {
    c.SwaggerDoc("v1", new Info { Title = "You api title", Version = "v1" });
    c.AddSecurityDefinition("Bearer",
        new ApiKeyScheme { In = "header",
          Description = "Please enter into field the word 'Bearer' following by space and JWT", 
          Name = "Authorization", Type = "apiKey" });
    c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> {
        { "Bearer", Enumerable.Empty<string>() },
    });

});

Vous pouvez ensuite utiliser le bouton "Autoriser" en haut à droite de la page.

Vous pouvez au moins essayer d'utiliser ce paquet pour générer une définition swagger valide

0 votes

Bonne réponse mais lorsque je fais cela avec le boilerplate ABP, cela ne fonctionne pas avec Dynamic Web Api ( aspnetboilerplate.com/Pages/Documents/Dynamic-Web-API )

6 votes

@VadimK Cela fonctionnait parfaitement jusqu'à ce que je passe à .NET Core 2.0.

13 votes

Si cela peut vous aider, dans la case Auth, dans la saisie de la valeur, vous devez mettre exactement l'en-tête Auth et pas seulement le JWT (dans le cas où vous l'utilisez). Cela signifie : Bearer votre_token_jwt

146voto

Igor Points 966

TIP !

Pour éviter cela, écrivez toujours le mot clé Bearer sur le Swagger(alias Swashbuckle ) dialogue d'authentification, comme : "bearer xT1..." vous pouvez utiliser le code/config ci-dessous sur ConfigureServices(...) à votre Startup classe :

using Microsoft.OpenApi.Models;
...

services.AddSwaggerGen(setup =>
{
    // Include 'SecurityScheme' to use JWT Authentication
    var jwtSecurityScheme = new OpenApiSecurityScheme
    {
        Scheme = "bearer",
        BearerFormat = "JWT",
        Name = "JWT Authentication",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        Description = "Put **_ONLY_** your JWT Bearer token on textbox below!",

        Reference = new OpenApiReference
        {
            Id = JwtBearerDefaults.AuthenticationScheme,
            Type = ReferenceType.SecurityScheme
        }
    };

    setup.AddSecurityDefinition(jwtSecurityScheme.Reference.Id, jwtSecurityScheme);

    setup.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        { jwtSecurityScheme, Array.Empty<string>() }
    });

});

Nous pouvons le faire, seulement en changeant le Type de l OpenApiSecurityScheme classe à :

Type = SecuritySchemeType.**Http**

au lieu de

Type = SecuritySchemeType.**ApiKey** .

:)

Like this...

Paquets :

Swashbuckle.AspNetCore(5.6.3)
Swashbuckle.AspNetCore.SwaggerUI(5.6.3)

J'utilise .NET Core 3.1, et j'espère que cela vous aidera !

45voto

João Ignacio Points 21

En utilisant ASP.Net Core 3.1, voici ce qui a fonctionné pour moi :

services.AddSwaggerGen(s =>
        {
            s.SwaggerDoc("v1", new OpenApiInfo
            {
                Version = "v1",
                Title = "Chat API",
                Description = "Chat API Swagger Surface",
                Contact = new OpenApiContact
                {
                    Name = "João Victor Ignacio",
                    Email = "ignaciojvig@gmail.com",
                    Url = new Uri("https://www.linkedin.com/in/ignaciojv/")
                },
                License = new OpenApiLicense
                {
                    Name = "MIT",
                    Url = new Uri("https://github.com/ignaciojvig/ChatAPI/blob/master/LICENSE")
                }

            });

            s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
            {
                Description = "JWT Authorization header using the Bearer scheme (Example: 'Bearer 12345abcdef')",
                Name = "Authorization",
                In = ParameterLocation.Header,
                Type = SecuritySchemeType.ApiKey,
                Scheme = "Bearer"
            });

            s.AddSecurityRequirement(new OpenApiSecurityRequirement
            {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Type = ReferenceType.SecurityScheme,
                            Id = "Bearer"
                        }
                    },
                    Array.Empty<string>()
                }
            });

        });

7voto

cdev Points 1883

Il n'est pas nécessaire de générer un jeton séparé et une clé dans swagger. Swagger supporte aussi la partie génération. Le travail ci-dessous pour moi avec asp.net core 3.1 et keycloack auth.

swagger.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme
{
    Type = SecuritySchemeType.OAuth2,
    Flows = new OpenApiOAuthFlows
    {
        Implicit = new OpenApiOAuthFlow
        {
            AuthorizationUrl = new Uri("https://youauthsrv.com/auth/realms/your-realm/protocol/openid-connect/auth"),
        }
    },
    In = ParameterLocation.Header,
    Scheme = JwtBearerDefaults.AuthenticationScheme,
});

swagger.AddSecurityRequirement(new OpenApiSecurityRequirement
{
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = JwtBearerDefaults.AuthenticationScheme
            }
        },
        new string[] {}
    }
});

dans Configurer

app.UseSwaggerUI(c =>
{
    c.OAuthClientId("clientname");
    c.OAuthRealm("your-realm");
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X