【发布时间】:2021-06-12 21:15:49
【问题描述】:
虽然我的最终目标是防止 Swagger UI 在浏览器重新加载时丢失身份验证,但我相信我可能已经找到了一个解决方案,假设在使用 api-platform 时可以更改 swagger-ui 参数,并在本文末尾进行了描述.
REST API 使用 Symfony、API 平台并使用 JWT 进行身份验证,文档由 swagger-ui 提供。在 swagger-ui 页面上,提交 apiKey 后,未来的请求会将其包含在 header 中,但是,如果刷新浏览器,授权令牌会丢失。
关于这个话题的讨论主要是在这个github post 和一些在这个stackoverflow post 上,普遍的共识似乎是swagger-ui 没有“官方”的方式来持久化令牌。
整个 Swagger UI 不存储令牌,并且可能是故意的。 没有启用此功能的开关,但看起来很少 可以通过 cookie、本地存储来记住令牌的方法, indexdb 等,当页面重新加载时,将令牌填充回来 在。
不过,swagger configuration documentation 似乎有一个 Authorization 参数,允许在浏览器刷新时保留授权数据。
- 参数名称:persistAuthorization
- Docker 变量:PERSIST_AUTHORIZATION
- 说明:布尔=假。如果设置为 true,它将保留授权数据,并且不会在浏览器关闭/刷新时丢失
假设我正确解释了 Swagger 文档,如何将 persistAuthorization 参数设置为 true?
将config/api_platform.yaml修改为设置persistAuthorization时,收到错误Unrecognized option "persistAuthorization" under "api_platform.swagger.api_keys.apiKey". Available options are "name", "type".和Unrecognized option "persistAuthorization" under "api_platform.swagger". Available options are "api_keys", "versions".
api_platform:
mapping:
paths: ['%kernel.project_dir%/src/Entity']
patch_formats:
json: ['application/merge-patch+json']
swagger:
api_keys:
apiKey:
name: Authorization
type: header
# persistAuthorization: true
versions: [3]
# persistAuthorization: true
然后我尝试添加config/swagger-conf.yaml 文件,但收到错误There is no extension able to load the configuration for "persistAuthorization"
---
persistAuthorization: true
如何防止 Swagger UI 在浏览器重新加载时丢失身份验证?使用 API-Platform 时如何更改 swagger-ui 参数?
编辑 - 新信息
根据 Tarun Lalwani 的评论,我找到了一种解决方法,但是仍然不理想。 API-Platform 基于一些 symfony/api-platform 配置设置创建public/bundles/apiplatform/init-swagger-ui.js 或将设置传递给它(我目前不这样做)。我希望这些在 api_platform.swagger 下,但是在查看源代码以及api-platform configuration document 之后,我仍然不知道如何完成它(甚至是否可能)。我的解决方法是直接编辑这个文件。由于这些捆绑文件通常不会被 git 跟踪,因此需要确保手动更新。另外,我担心 api-platform 是否会修改文件。
'use strict';
window.onload = function() {
const ui = SwaggerUIBundle({
...
persistAuthorization: true, <= Line 49
...
});
};
api_platform.yaml如下,但是令牌没有被持久化。
api_platform:
mapping:
paths: ['%kernel.project_dir%/src/Entity']
patch_formats:
json: ['application/merge-patch+json']
show_webby: false
swagger:
api_keys:
apiKey:
name: Authorization
type: header
versions: [3]
swagger_ui_extra_configuration:
persistAuthorization: true,
composer.json 现在显示"api-platform/core": "2.7.x-dev",但composer recipes api-platform/core 仍然表明正在使用 api-platform 2.5。我试过同时使用 PHP7.4 和 PHP8。 composer depends api-platform/core 显示 2.7.x-dev,我现在 swagger_ui_extra_configuration 存在于源代码中,这很好,但仍然没有保留令牌。
[michael@devserver api_platform_test]$ composer recipes api-platform/core
name : api-platform/core
version : 2.5
status : up to date
installed recipe : https://github.com/symfony/recipes/tree/7df6db4/api-platform/core/2.5
files :
├──config
│ ├──packages
│ │ └──api_platform.yaml
│ └──routes
│ └──api_platform.yaml
└──src
└──Entity
└──.gitignore
[michael@devserver api_platform_test]$ composer show --tree api-platform/core
api-platform/core dev-main Build a fully-featured hypermedia or GraphQL API in minutes!
├──doctrine/inflector ^1.0 || ^2.0
│ └──php ^7.2 || ^8.0
├──fig/link-util ^1.0
│ ├──php >=8.0.0
│ └──psr/link ^1.1.0 | ^2.0.0
│ └──php >=8.0.0
├──php >=7.1
├──psr/cache ^1.0
│ └──php >=5.3.0
├──psr/container ^1.0
│ └──php >=7.2.0
├──symfony/http-foundation ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-mbstring ~1.1
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ^1.15
│ └──php >=7.1
├──symfony/http-kernel ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──psr/log ~1.0
│ │ └──php >=5.3.0
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/error-handler ^4.4|^5.0
│ │ ├──php >=7.2.5
│ │ ├──psr/log ^1.0
│ │ │ └──php >=5.3.0
│ │ ├──symfony/polyfill-php80 ^1.15
│ │ │ └──php >=7.1
│ │ └──symfony/var-dumper ^4.4|^5.0
│ │ ├──php >=7.2.5
│ │ ├──symfony/polyfill-mbstring ~1.0
│ │ │ └──php >=7.1
│ │ └──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ ├──symfony/event-dispatcher ^5.0
│ │ ├──php >=7.2.5
│ │ ├──symfony/deprecation-contracts ^2.1
│ │ │ └──php >=7.1
│ │ ├──symfony/event-dispatcher-contracts ^2
│ │ │ ├──php >=7.2.5
│ │ │ └──psr/event-dispatcher ^1
│ │ │ └──php >=7.2.0
│ │ └──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ ├──symfony/http-client-contracts ^1.1|^2
│ │ └──php >=7.2.5
│ ├──symfony/http-foundation ^4.4|^5.0
│ │ ├──php >=7.2.5
│ │ ├──symfony/deprecation-contracts ^2.1
│ │ │ └──php >=7.1
│ │ ├──symfony/polyfill-mbstring ~1.1
│ │ │ └──php >=7.1
│ │ └──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ ├──symfony/polyfill-ctype ^1.8
│ ├──symfony/polyfill-php73 ^1.9
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ^1.15
│ └──php >=7.1
├──symfony/property-access ^3.4.19 || ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ └──symfony/property-info ^5.2
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ └──symfony/string ^5.1
│ ├──php >=7.2.5
│ ├──symfony/polyfill-ctype ~1.8
│ ├──symfony/polyfill-intl-grapheme ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-intl-normalizer ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-mbstring ~1.0
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ~1.15
│ └──php >=7.1
├──symfony/property-info ^3.4 || ^4.4 || ^5.2.1
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ └──symfony/string ^5.1
│ ├──php >=7.2.5
│ ├──symfony/polyfill-ctype ~1.8
│ ├──symfony/polyfill-intl-grapheme ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-intl-normalizer ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-mbstring ~1.0
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ~1.15
│ └──php >=7.1
├──symfony/serializer ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──symfony/polyfill-ctype ~1.8
│ └──symfony/polyfill-php80 ^1.15
│ └──php >=7.1
├──symfony/web-link ^4.4 || ^5.1
│ ├──php >=7.2.5
│ └──psr/link ^1.0
│ └──php >=8.0.0
└──willdurand/negotiation ^2.0.3 || ^3.0
└──php >=7.1.0
[michael@devserver api_platform_test]$ php80 /usr/local/bin/composer show --tree api-platform/core
api-platform/core dev-main Build a fully-featured hypermedia or GraphQL API in minutes!
├──doctrine/inflector ^1.0 || ^2.0
│ └──php ^7.2 || ^8.0
├──fig/link-util ^1.0
│ ├──php >=8.0.0
│ └──psr/link ^1.1.0 | ^2.0.0
│ └──php >=8.0.0
├──php >=7.1
├──psr/cache ^1.0
│ └──php >=5.3.0
├──psr/container ^1.0
│ └──php >=7.2.0
├──symfony/http-foundation ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-mbstring ~1.1
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ^1.15
│ └──php >=7.1
├──symfony/http-kernel ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──psr/log ~1.0
│ │ └──php >=5.3.0
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/error-handler ^4.4|^5.0
│ │ ├──php >=7.2.5
│ │ ├──psr/log ^1.0
│ │ │ └──php >=5.3.0
│ │ ├──symfony/polyfill-php80 ^1.15
│ │ │ └──php >=7.1
│ │ └──symfony/var-dumper ^4.4|^5.0
│ │ ├──php >=7.2.5
│ │ ├──symfony/polyfill-mbstring ~1.0
│ │ │ └──php >=7.1
│ │ └──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ ├──symfony/event-dispatcher ^5.0
│ │ ├──php >=7.2.5
│ │ ├──symfony/deprecation-contracts ^2.1
│ │ │ └──php >=7.1
│ │ ├──symfony/event-dispatcher-contracts ^2
│ │ │ ├──php >=7.2.5
│ │ │ └──psr/event-dispatcher ^1
│ │ │ └──php >=7.2.0
│ │ └──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ ├──symfony/http-client-contracts ^1.1|^2
│ │ └──php >=7.2.5
│ ├──symfony/http-foundation ^4.4|^5.0
│ │ ├──php >=7.2.5
│ │ ├──symfony/deprecation-contracts ^2.1
│ │ │ └──php >=7.1
│ │ ├──symfony/polyfill-mbstring ~1.1
│ │ │ └──php >=7.1
│ │ └──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ ├──symfony/polyfill-ctype ^1.8
│ ├──symfony/polyfill-php73 ^1.9
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ^1.15
│ └──php >=7.1
├──symfony/property-access ^3.4.19 || ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ └──symfony/property-info ^5.2
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ └──symfony/string ^5.1
│ ├──php >=7.2.5
│ ├──symfony/polyfill-ctype ~1.8
│ ├──symfony/polyfill-intl-grapheme ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-intl-normalizer ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-mbstring ~1.0
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ~1.15
│ └──php >=7.1
├──symfony/property-info ^3.4 || ^4.4 || ^5.2.1
│ ├──php >=7.2.5
│ ├──symfony/deprecation-contracts ^2.1
│ │ └──php >=7.1
│ ├──symfony/polyfill-php80 ^1.15
│ │ └──php >=7.1
│ └──symfony/string ^5.1
│ ├──php >=7.2.5
│ ├──symfony/polyfill-ctype ~1.8
│ ├──symfony/polyfill-intl-grapheme ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-intl-normalizer ~1.0
│ │ └──php >=7.1
│ ├──symfony/polyfill-mbstring ~1.0
│ │ └──php >=7.1
│ └──symfony/polyfill-php80 ~1.15
│ └──php >=7.1
├──symfony/serializer ^4.4 || ^5.1
│ ├──php >=7.2.5
│ ├──symfony/polyfill-ctype ~1.8
│ └──symfony/polyfill-php80 ^1.15
│ └──php >=7.1
├──symfony/web-link ^4.4 || ^5.1
│ ├──php >=7.2.5
│ └──psr/link ^1.0
│ └──php >=8.0.0
└──willdurand/negotiation ^2.0.3 || ^3.0
└──php >=7.1.0
[michael@devserver api_platform_test]$ php80 /usr/local/bin/composer recipes api-platform/core
name : api-platform/core
version : 2.5
status : up to date
installed recipe : https://github.com/symfony/recipes/tree/7df6db4/api-platform/core/2.5
files :
├──config
│ ├──packages
│ │ └──api_platform.yaml
│ └──routes
│ └──api_platform.yaml
└──src
└──Entity
└──.gitignore
[michael@devserver api_platform_test]$
【问题讨论】:
-
可以看看你的设置吗?我不确定文档生成是如何工作的。但是看看这个链接github.com/psfpro/ddd-cms-sample/blob/…是否对你有帮助
-
@TarunLalwani 该设置由 API-Platform 根据我最初发布的 config/packages/api_platform.yaml 中的设置进行管理。根据您的评论,我找到了一个解决方法,并在我最初的帖子末尾发布。尽管如此,想要一个更可维护的解决方案,但是,这将在此期间起作用。如果你有更好的想法,请指教。谢谢!
-
好像有更好的办法,就是设置
extraConfigurationgithub.com/api-platform/core/blob/…,随便找哪个地方 -
同意那将是一个更好的方法。使用git安装时,我看到
swagger_ui_extra_configuration现在是swagger下api_platform.yaml中的一个属性,但是在composer安装时不可用。感谢您的帮助! -
你在作曲家
2.6.3使用的是哪个版本?
标签: symfony jwt swagger-ui api-platform.com