Swagger Spesifikasyonunda (swagger.json) 'Yetkilendirme: Taşıyıcı <token>' nasıl temsil edebilirim


114

Kimlik doğrulama / güvenlik düzeninin aşağıdaki gibi bir başlık ayarlamayı gerektirdiğini ifade etmeye çalışıyorum:

Authorization: Bearer <token>

Bu, havalı dokümantasyona dayanarak sahip olduğum şey :

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

Yanıtlar:


140

Belki bu yardımcı olabilir:

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'

Sonuçları kontrol etmek için buraya kopyalayıp yapıştırabilirsiniz: http://editor.swagger.io/#/ .

Ayrıca, swagger düzenleyici web'de size yardımcı olabilecek daha karmaşık güvenlik yapılandırmalarına sahip birkaç örnek vardır.


4
Editöre, 200 alabilmeniz için hangi kullanıcı ve şifreyi veya Temel jetonu göndereceğini nasıl söylüyorsunuz anlamıyorum. Bir şey mi kaçırıyorum?
Rob

1
Tamam, boşver. Görünüşe göre "Kimlik Doğrulama", bir giriş formu almak için tıklayabileceğiniz bir şey.
Rob

Peki jetona nasıl değer atayabilirim? curl -x get --header "Yetkilendirme: apiKey = 123" denedim ama hiçbir şey olmadı
Gobliins

2
@ İstediğiniz gobliins , taşıyıcı jetonunuz curl -X GET -H "Authorization: Bearer your_token"nerede your_token. Örneğincurl -X GET -H "Accept: application/json" -H "Authorization: Bearer 00000000-0000-0000-0000-000000000000" "http://localhost/secure-endpoint"
Steve K

15
Ne yazık ki bu, Swagger UI ile iyi çalışmıyor - "Yetkilendir" i tıklamak ve çıplak bir belirteç sağlamak , OpenAPI 3 yanıtı -H "Authorization: foo"yerine "Deneyin" curl örnekleri oluşturacaktır-H "Authorization: Bearer foo"
Abe Voelker

56

OpenAPI 3.0.0'da taşıyıcı kimlik doğrulaması

OpenAPI 3.0 artık yerel olarak Bearer / JWT kimlik doğrulamasını desteklemektedir. Şöyle tanımlanır:

openapi: 3.0.0
...

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

security:
  - bearerAuth: []

Bu, Swagger UI 3.4.0+ ve Swagger Editor 3.1.12+ sürümlerinde desteklenir (yine, yalnızca OpenAPI 3.0 özellikleri için!).

Kullanıcı arayüzünde, hamiline tıklayıp girebileceğiniz "Yetkilendir" düğmesi görüntülenir ("Taşıyıcı" öneki olmadan yalnızca jetonun kendisi). Bundan sonra, Authorization: Bearer xxxxxxbaşlık ile birlikte "dene" istekleri gönderilecektir .

AuthorizationProgramlı olarak başlık ekleme (Swagger UI 3.x)

Swagger UI kullanıyorsanız ve herhangi bir nedenle, Authorizationkullanıcıların "Yetkilendir" i tıklayıp jetonu girmesini sağlamak yerine program aracılığıyla başlığı eklemeniz gerekiyorsa requestInterceptor,. Bu çözüm, Swagger UI 3.x içindir ; UI 2.x farklı bir teknik kullandı.

// index.html

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

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

1
Bunu flask-restplus tarafından oluşturulan swagger belgelerine nasıl uygulayabilirim?
Chang Zhao

Cevabın sorulan soru ile uyumlu olup olmadığından şüpheliyim.
Vishrant

16

Neden "Kabul Edilen Cevap" çalışıyor ... ama benim için yeterli değildi

Bu, spesifikasyonda çalışır. En azından swagger-tools(sürüm 0.10.1) bunu geçerli olarak doğrular.

Ancak swagger-codegen(sürüm 2.1.6) gibi başka araçlar kullanıyorsanız , oluşturulan istemci aşağıdaki gibi Kimlik Doğrulama tanımını içerse bile bazı zorluklarla karşılaşacaksınız:

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

Yöntem (uç nokta) çağrılmadan önce belirteci başlığa geçirmenin bir yolu yoktur. Bu işlev imzasına bakın:

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

Bu, yalnızca geri aramayı (diğer durumlarda sorgu parametreleri, vb.) Belirteç olmadan ilettiğim anlamına gelir, bu da isteğin sunucuya yanlış yapılandırılmasına neden olur.

Benim alternatifim

Ne yazık ki "güzel" değil ama Swagger'da JWT Tokens desteği alana kadar işe yarıyor.

Not: tartışılan

Bu nedenle, kimlik doğrulamasını standart bir başlık gibi ele alır. Açık pathbir nesne, bir başlık parametrenin içine ekleyin:

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'

Bu, yöntem imzasında yeni bir parametreye sahip bir istemci oluşturacaktır:

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

Bu yöntemi doğru şekilde kullanmak için "tam dizeyi" iletmeniz yeterlidir.

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

Ve çalışır.


"jeton başka yerden geliyor" ... Ben başka yerden ilgileniyorum. Oturum açtığınızda girişinize yönlendirildiğinizde ve swagger api'nize yeniden yönlendirildiğinde, aldığınız erişim jetonunu nasıl kullanabilirsiniz?
Nadine

1

Openapi 3.0.0 kullanarak JSON'da 2020 yanıtını yayınlama:

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


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

0

Bunu çözmenin Hackie yolu, benim durumumda echo-swagger paketindeki swagger.go dosyasını değiştirmekti:

Dosyanın alt kısmında window.onload işlevini, belirteci doğru şekilde biçimlendiren bir requestInterceptor içerecek şekilde güncelleyin.

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

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.