Swagger UI игнорирует расширение x-tokenName - PullRequest
1 голос
/ 17 января 2020

Я использую Swashbuckle v5.0.0 в приложении. net -core 2.1 для создания своей API-документации.

Я добавил это определение безопасности:

cfg.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
   Name = "oauth2",
   Type = SecuritySchemeType.OAuth2,
   Scheme = IdentityServerAuthenticationDefaults.AuthenticationScheme,
   Extensions = new Dictionary<string, IOpenApiExtension>
   {
      { "x-tokenName", new OpenApiString("token id_token") }
   },
   Flows = new OpenApiOAuthFlows()
   {
      Implicit = new OpenApiOAuthFlow()
      {
         Scopes = swaggerSettings.Scopes,
         AuthorizationUrl = new Uri(authorizationUrl),
         TokenUrl = new Uri(swaggerSettings.IdentityProviderUrl + "/connect/token"),
      }                                
   },
});

Это это API-спецификация, которая генерируется из него (только важная часть):

The security part of the generated API-Specification

Она почти идеально работает, так как я могу даже открыть следующий диалог в пользовательском интерфейсе swagger, а также выполните полную авторизацию:

Fully working authorize dialog

Но проблема в том, что значение x-tokenName установлено в " token id_token "(который требуется для получения токена доступа, содержащего также идентификационные области, как profile и openid), запрос, отправленный пользователем swagger-ui, записанный fiddler, (сокращен до важной части):

GET /usermgmt/identityprovider/connect/authorize?response_type=token&[...]

В Интернете я могу найти темы о том, что то, что я пытаюсь достичь, какое-то время поддерживалось, тогда это было не так, и я не знаю, так ли это сейчас - кажется, что нет, но я думаю, что это функция важна, поэтому она должна быть там.

Мне нужно это потому, что я хочу запрашивать группы пользователей из конечной точки профиля, используя токены доступа, созданные по запросу swagger-ui.

Пожалуйста, помогите:)

1 Ответ

1 голос
/ 17 января 2020

Вы неправильно понимаете цель x-tokenName в интерфейсе Swagger. Это расширение указывает поле ответа конечной точки маркера OAuth 2.0, которое необходимо извлечь и впоследствии использовать в Authorization: Bearer <token>.

. По умолчанию токен-носитель извлекается из access_token:

{
  "access_token": "abcde12345",
  "token_type": "Bearer",
  "expires_in": 3599,
  "id_token": "...."
}

=>

Authorization: Bearer abcde12345

Если в определении схемы безопасности указано, например, x-tokenName: id_token, в качестве маркера-носителя будет использоваться значение id_token:

{
  "access_token": "....",
  "token_type": "Bearer",
  "expires_in": 3599,
  "id_token": "xyz987"
}

=>

Authorization: Bearer xyz987

Дополнительная информация о x-tokenName: здесь и здесь .

Я хочу добиться, чтобы swagger ui ссылки авторизации генерировал и отправлял пользователя провайдеру идентификации, содержащему "response_type = token id_token & [...]"

id_token используется в потоках Open ID Connect (OID C), который является расширением OAuth 2.0. Swagger UI в настоящее время не поддерживает OID C.

Когда OID C поддерживается в Swagger UI, вам также необходимо изменить определение схемы безопасности с type: oauth2 на type: openIdConnect:

{
  ...
  "components": {
    "securitySchemes": {
      "openId": {
        "type": "openIdConnect",
        "openIdConnectUrl": "https://path/to/.well-known/openid-configuration"
      }
    }
  }
}
...