Есть ли лучший способ реализовать безопасность OAuth в API Swagger-Tools?
Я подготовил определение Swagger 2.0 для моего API, реализованного в файле node.js/connect. Я добавил определения безопасности:
securityDefinitions:
BasicAuth:
type: basic
OAuth2:
type: oauth2
flow: accessCode
authorizationUrl: http://localhost:9080/auth/realms/master/protocol/openid-connect/auth
tokenUrl: http://localhost:9080/auth/realms/master/protocol/openid-connect/token
scopes:
scope1: my scope 1
scope2: my scope 2
и API:
/myAPI:
post:
[...]
security:
- BasicAuth: []
- OAuth2: [scope1]
Таким образом, API защищен либо базовой HTTP-аутентификацией, либо OAuth2 (на самом деле токеном-носителем), для чего требуется область действия "scope1". Теперь реализация. Я использую инструменты swagger для создания моей заглушки API:
java -jar swagger-codegen-cli.jar создать -l nodejs-сервер -i my.yaml -o out
Насколько я знаю, сгенерированный код swagger-tools никак не влияет на безопасность, поэтому я добавил для этого специальный код:
[...]
let secoptions = {
'BasicAuth': function( req, securityDefinition, scopes, callback) {
basicAuth( req, callback);
},
'OAuth2': function( req, securityDefinition, scopes, callback) {
oAuth2( req, scopes, callback);
}
}
app.use( middleware.swaggerSecurity( secoptions));
[...other swagger-tools generated init code...]
Я использую паспорт-http BasicStrategy для обработки BasicAuth. Я использую стратегию passport-http-bearer с openid-client для обработки токенов канала oAuth2. И это работает, однако:
- Мне просто интересно, если я использую правильные инструменты / библиотеки здесь?
- Действительно ли swagger-tools ничего не делает с безопасностью, определенной в файле Swagger?
- Полностью отсутствует автоматическая обработка / проверка контекста - мне нужно вручную проверить в функции oAuth2, содержит ли предоставленный токен (в качестве носителя) области, требуемые определением API Swagger. Это правильный способ сделать это или, может быть, есть какая-то скрытая опция или что-то для автоматической проверки областей?