2015-06-05 13 views
7

Używamy Swashbuckle do udokumentowania naszej api web i użycia jej do przetestowania naszego web apisa. Chcę wiedzieć, w jaki sposób można przekazać wiele niestandardowych nagłówków o różnych wartościach dla każdego żądania za pomocą interfejsu użytkownika Swagger.Jak przekazywać niestandardowe nagłówki podczas wywoływania interfejsu webowego za pomocą Swagger (Swashbuckle)

Widziałem odpowiedź podobną do poniższej w Internecie, aby przekazać nagłówek w interfejsie użytkownika Swagger, ale nie byłem w stanie jej zrozumieć. To, co jest mylące, dotyczy pliku SwaggerExtensions. Jaki jest cel tego pliku i dlaczego istnieje wzmianka o tym pliku w kwalifikowanej nazwie pliku js.

1. Dodaj nowy plik o nazwie "SwaggerExtensions", a następnie dodaj nowy plik JS o nazwie "onComplete.js", musisz zmienić akcję kompilacji dla tego pliku na "Embedded Resource".

2.Inside plik „onComplete.js” wklej następujący kod:

$('#input_apiKey').change(function() { 

var key = $('#input_apiKey')[0].value; 
if (key && key.trim() != "") { 
key = "Bearer " + key; 
window.authorizations.add("key", new ApiKeyAuthorization("Authorization", key, "header")); 
} 
}); 

3. Otwórz plik „i” SwaggerConfig.cs wewnątrz metody rejestru wklej poniższy kod:

SwaggerUiConfig.Customize(c => 
{ 
c.SupportHeaderParams = true; 
c.InjectJavaScript(typeof(SwaggerConfig).Assembly,  "AngularJSAuthentication.API.SwaggerExtensions.onComplete.js"); 
}); 

Odpowiedz

7

Implementacja Swashbuckles przekupu czyta komentarze kodu XML w celu wygenerowania wymaganej specyfikacji ataku. Niestety, jeśli potrzebujesz żądania nagłówka autoryzacji (tokenu dostępu), prośba o komentarze do kodu XML nie dostarcza tych informacji do Swashbuckle. Będziesz musiał ręcznie wstrzyknąć ten nowy parametr podczas generowania specyfikacji oszustwa.

Swashbuckle udostępnia interfejs o nazwie IOperationFilter w celu zastosowania nowych parametrów. Implementacja tego interfejsu będzie wyglądać mniej więcej tak.

public class AddAuthorizationHeaderParameterOperationFilter: IOperationFilter 
{ 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     var filterPipeline = apiDescription.ActionDescriptor.GetFilterPipeline(); 
     var isAuthorized = filterPipeline 
             .Select(filterInfo => filterInfo.Instance) 
             .Any(filter => filter is IAuthorizationFilter); 

     var allowAnonymous = apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any(); 

     if (isAuthorized && !allowAnonymous) 
     { 
      operation.parameters.Add(new Parameter { 
       name = "Authorization", 
       @in = "header", 
       description = "access token", 
       required = true, 
       type = "string"      
      }); 
     } 
    } 
} 

Wewnątrz pliku SwaggerConfig.cs, dodać następujące

public class SwaggerConfig 
{ 
    public static void Register() 
    { 
     var thisAssembly = typeof(SwaggerConfig).Assembly; 

     GlobalConfiguration.Configuration 
      .EnableSwagger(c => 


       c.SingleApiVersion("v1", "API").Description("An API ") 
                 .TermsOfService("Some terms") 
                 .Contact(cc => cc.Name("Team") 
                 .Email("[email protected]")); 

       c.OperationFilter(() => new AuthorizationHeaderParameterOperationFilter())); 


     } 
} 
+2

Ale chcę przekazać wartość nagłówka z UI (Swagger-UI). Jak przekazać wartość nagłówka? –

+0

Dzięki @nimacks, to działało dla mnie. Chociaż z jakiegoś powodu moje parametry operation.parameters były zerowe, więc dodałem sprawdzanie, które zainicjuje je, jeśli jest puste przed dodaniem wymaganego parametru. – MaxJ

1

Możesz dodać parametr z SwaggerUI:

swaggerUi.api.clientAuthorizations.add("key", new SwaggerClient.ApiKeyAuthorization("api_key", key, "header")); 
6

Swashbuckle sugerują użycie InjectJavaScript do osiągnięcia tego celu. https://github.com/domaindrivendev/Swashbuckle#injectjavascript

Poniższy kod służy do dodawania tokena na okaziciela w celu autoryzacji w nagłówku http.

httpConfiguration 
.EnableSwagger(c => c.SingleApiVersion("v1", "A title for your API")) co 
.EnableSwaggerUi(c => 
    { 
     c.InjectJavaScript(containingAssembly, "ProjectName.SwaggerUIEnableBearerToken.js"); 
    }); 

SwaggerUIEnableBearerToken.js

$(function() { 
$('#input_apiKey').attr("placeholder", "bearer token"); 
$('#input_apiKey').off(); 
$('#input_apiKey').change(function() { 
    var token = this.value; 
    if (token && token.trim() !== '') { 
     token = 'Bearer ' + token; 
     var apiKeyAuth = new window.SwaggerClient.ApiKeyAuthorization("Authorization", token, "header"); 
     window.swaggerUi.api.clientAuthorizations.add("token", apiKeyAuth); 
     } 
    } 
}); 
})(); 

Zobacz więcej od tego wątku emisyjnej: https://github.com/domaindrivendev/Swashbuckle/issues/222

+2

To działało dla mnie jak urok. – PancakeParfait

+0

Dzięki. To działało również dla mnie. – Karthik

+0

co to jest zawierającyAssembly? – blthiewes

Powiązane problemy