Come posso rappresentare "Authorization: Bearer <token>" in una Swagger Spec (swagger.json)


114

Sto cercando di comunicare che lo schema di autenticazione / sicurezza richiede l'impostazione di un'intestazione come segue:

Authorization: Bearer <token>

Questo è ciò che ho basato sulla documentazione spavalda :

securityDefinitions:
  APIKey:
    type: apiKey
    name: Authorization
    in: header
security:
  - APIKey: []

Risposte:


140

Forse questo può aiutare:

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'

Puoi copiarlo e incollarlo qui: http://editor.swagger.io/#/ per controllare i risultati.

Ci sono anche diversi esempi nel web dell'editor spavaldo con configurazioni di sicurezza più complesse che potrebbero aiutarti.


4
Non vedo come dici all'editor quale utente e password o token di base inviare in modo da poter ottenere un 200. Mi manca qualcosa?
Rob l'

1
Ok, fa niente. Apparentemente "Autentica" è qualcosa su cui puoi fare clic per ottenere un modulo di accesso.
Rob l'

Quindi come imposto un valore al token? ho provato curl -x get --header "Autorizzazione: apiKey = 123" ma non è successo niente
Gobliins

2
@Gobliins che vuoi curl -X GET -H "Authorization: Bearer your_token", dov'è il your_tokentuo gettone portatore. Ad esempiocurl -X GET -H "Accept: application/json" -H "Authorization: Bearer 00000000-0000-0000-0000-000000000000" "http://localhost/secure-endpoint"
Steve K

15
Sfortunatamente questo non funziona bene con l'interfaccia utente di Swagger: facendo clic su "Autorizza" e fornendo un token nudo verranno generati esempi di arricciatura "Provalo" con -H "Authorization: foo"invece della -H "Authorization: Bearer foo"risposta OpenAPI 3
Abe Voelker

56

Autenticazione al portatore in OpenAPI 3.0.0

OpenAPI 3.0 ora supporta in modo nativo l'autenticazione Bearer / JWT. È definito così:

openapi: 3.0.0
...

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT  # optional, for documentation purposes only

security:
  - bearerAuth: []

Questo è supportato in Swagger UI 3.4.0+ e Swagger Editor 3.1.12+ (di nuovo, solo per le specifiche OpenAPI 3.0!).

L'interfaccia utente mostrerà il pulsante "Autorizza", su cui puoi fare clic e inserire il token portatore (solo il token stesso, senza il prefisso "Bearer"). Dopodiché, le richieste di "prova" verranno inviate con l' Authorization: Bearer xxxxxxintestazione.

Aggiunta di Authorizationintestazione a livello di codice (Swagger UI 3.x)

Se utilizzi l'interfaccia utente di Swagger e, per qualche motivo, devi aggiungere l' Authorizationintestazione a livello di codice invece di chiedere agli utenti di fare clic su "Autorizza" e immettere il token, puoi utilizzare il requestInterceptor. Questa soluzione è per Swagger UI 3.x ; UI 2.x utilizzava una tecnica diversa.

// index.html

const ui = SwaggerUIBundle({
  url: "http://your.server.com/swagger.json",
  ...

  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer xxxxxxx"
    return req
  }
})

1
Come posso implementarlo nella documentazione di spavalderia generata da flask-restplus?
Chang Zhao

Dubito che la risposta sia in linea con la domanda che è stata posta.
Vishrant

16

Perché "Risposta accettata" funziona ... ma non era abbastanza per me

Questo funziona nelle specifiche. Almeno swagger-tools(versione 0.10.1) lo convalida come valido.

Ma se stai usando altri strumenti come swagger-codegen(versione 2.1.6) troverai alcune difficoltà, anche se il client generato contiene la definizione di autenticazione, come questa:

this.authentications = {
  'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};

Non è possibile passare il token nell'intestazione prima che venga chiamato il metodo (endpoint). Guarda in questa firma della funzione:

this.rootGet = function(callback) { ... }

Ciò significa che passo solo il callback (in altri casi parametri di query, ecc.) Senza un token, il che porta a una compilazione errata della richiesta al server.

La mia alternativa

Sfortunatamente, non è "carino" ma funziona finché non ricevo il supporto per i token JWT su Swagger.

Nota: di cui si discute in

Quindi gestisce l'autenticazione come un'intestazione standard. Su pathoggetto aggiungere un paremeter intestazione:

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'

Questo genererà un client con un nuovo parametro sulla firma del metodo:

this.rootGet = function(authorization, callback) {
  // ...
  var headerParams = {
    'authorization': authorization
  };
  // ...
}

Per utilizzare questo metodo nel modo giusto, basta passare la "stringa completa"

// 'token' and 'cb' comes from elsewhere
var header = 'Bearer ' + token;
sdk.rootGet(header, cb);

E funziona.


"il token viene da altrove" ... Mi interessa altrove. Cosa succede quando hai effettuato l'accesso e sei stato reindirizzato al tuo login e reindirizzato alla tua API spavalda, come puoi utilizzare il token di accesso che hai ricevuto?
Nadine

1

Pubblicazione della risposta 2020 in JSON utilizzando openapi 3.0.0:

{
  "openapi": "3.0.0",
  ...
  "servers": [
    {
      "url": "/"
    }
  ],
  ...
  "paths": {
    "/skills": {
      "put": {
        "security": [
           {
              "bearerAuth": []
           }
        ],
       ...
  },


  "components": {        
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}

0

Il mio modo Hackie per risolvere questo problema è stato modificare il file swagger.go nel pacchetto echo-swagger nel mio caso:

In fondo al file aggiorna la funzione window.onload per includere un requestInterceptor che formatta correttamente il token.

window.onload = function() {
  // Build a system
  const ui = SwaggerUIBundle({
  url: "{{.URL}}",
  dom_id: '#swagger-ui',
  validatorUrl: null,
  presets: [
    SwaggerUIBundle.presets.apis,
    SwaggerUIStandalonePreset
  ],
  plugins: [
    SwaggerUIBundle.plugins.DownloadUrl
  ,
  layout: "StandaloneLayout",
  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer " + req.headers.Authorization
  return req
  }
})

window.ui = ui

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.