J'essaie de faire comprendre que le schéma d'authentification/sécurité nécessite de définir un en-tête comme suit:
Authorization: Bearer <token>
C’est ce que j’ai basé sur le documentation swagger :
securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
Peut-être que cela peut aider:
swagger: '2.0'
info:
version: 1.0.0
title: Based on "Basic Auth Example"
description: >
An example for how to use Auth with Swagger.
Host: basic-auth-server.herokuapp.com
schemes:
- http
- https
securityDefinitions:
Bearer:
type: apiKey
name: Authorization
in: header
paths:
/:
get:
security:
- Bearer: []
responses:
'200':
description: 'Will send `Authenticated`'
'403':
description: 'You do not have necessary permissions for the resource'
Vous pouvez copier et coller ici: http://editor.swagger.io/#/ pour consulter les résultats.
Il existe également plusieurs exemples dans l'éditeur swagger Web avec des configurations de sécurité plus complexes qui pourraient vous aider.
OpenAPI 3. supporte maintenant l'authentification Bearer/JWT en mode natif. C'est défini comme ceci:
openapi: 3.0.0
...
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT # optional, for documentation purposes only
security:
- bearerAuth: []
Ceci est pris en charge dans Swagger UI 3.4.0+ et Swagger Editor 3.1.12+ (encore une fois, pour les spécifications OpenAPI 3.0 uniquement!).
L’UI affiche le bouton "Autoriser" sur lequel vous pouvez cliquer et entrer le jeton du porteur (juste le jeton lui-même, sans le préfixe "Au porteur"). Après cela, les requêtes "try it out" seront envoyées avec l'en-tête Authorization: Bearer xxxxxx
.
Authorization
par programme (Swagger UI 3.x)Si vous utilisez l'interface utilisateur Swagger et que, pour une raison quelconque, vous devez ajouter l'en-tête Authorization
par programme au lieu de demander aux utilisateurs de cliquer sur "Autoriser" et de saisir le jeton, vous pouvez utiliser le paramètre requestInterceptor
. Cette solution concerne Swagger UI 3.x ; L'interface utilisateur 2.x utilisait une technique différente.
// index.html
const ui = SwaggerUIBundle({
url: "http://your.server.com/swagger.json",
...
requestInterceptor: (req) => {
req.headers.Authorization = "Bearer xxxxxxx"
return req
}
})
Pourquoi la "réponse acceptée" fonctionne ... mais cela ne m'a pas suffi
Cela fonctionne dans la spécification. Au moins swagger-tools
(version 0.10.1) le valide comme valide.
Mais si vous utilisez d'autres outils comme swagger-codegen
(version 2.1.6), vous rencontrerez des difficultés, même si le client généré contient la définition de l'authentification, comme ceci:
this.authentications = {
'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};
Il n'y a aucun moyen de passer le jeton dans l'en-tête avant que la méthode (point de terminaison) soit appelée. Regardez dans cette signature de fonction:
this.rootGet = function(callback) { ... }
Cela signifie que je ne fais que passer le rappel (dans les autres cas, les paramètres de requête, etc.) sans jeton, ce qui entraîne une génération incorrecte de la demande au serveur.
Mon alternative
Malheureusement, ce n'est pas "joli" mais cela fonctionne jusqu'à ce que j'obtienne le support JWT Tokens sur Swagger.
Note: ce qui est discuté dans
Ainsi, il s’agit de l’authentification comme un en-tête standard. Sur l'objet path
, ajoutez un paramètre d'en-tête:
swagger: '2.0'
info:
version: 1.0.0
title: Based on "Basic Auth Example"
description: >
An example for how to use Auth with Swagger.
Host: localhost
schemes:
- http
- https
paths:
/:
get:
parameters:
-
name: authorization
in: header
type: string
required: true
responses:
'200':
description: 'Will send `Authenticated`'
'403':
description: 'You do not have necessary permissions for the resource'
Cela générera un client avec un nouveau paramètre sur la signature de la méthode:
this.rootGet = function(authorization, callback) {
// ...
var headerParams = {
'authorization': authorization
};
// ...
}
Pour utiliser cette méthode correctement, il suffit de passer la "chaîne complète"
// 'token' and 'cb' comes from elsewhere
var header = 'Bearer ' + token;
sdk.rootGet(header, cb);
Et fonctionne.