4

我有一个使用 MP-OpenApi 的 JAX-RS 应用程序来提供使用 OpenLiberty 的 OpenAPI UI。我的 API 使用 OAuth2 隐式流进行身份验证。这是当前使用注释配置的,如下所示:

@SecurityScheme(
    securitySchemeName = JaxRsApplication.OAUTH2_SECURITY_SCHEME_NAME,
    type = SecuritySchemeType.OAUTH2,
    flows = @OAuthFlows(
            implicit = @OAuthFlow(
                    authorizationUrl = "https://auth-server/connect/authorize",
                    scopes = @OAuthScope(name = "some-api-scope", description = "Some API Scope"))))

我的目标是在配置文件中配置 authenticationUrl 值,而不是在注释中硬编码它,以便我可以将其配置为不同的服务器环境作为 CI/CD 步骤。这可以做到吗?

另外,有没有办法选择一些范围并在 OpenAPI UI 中自动填充客户端 ID?

干杯。

4

1 回答 1

3

覆盖 URL

关于Microprofile OpenAPI Spec: OASFilter,我们可以覆盖authorizationUrl如下示例:-

package my.filter;

import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.ConfigProvider;

import org.eclipse.microprofile.openapi.OASFilter;
import org.eclipse.microprofile.openapi.models.security.SecurityScheme;

public class DemoOASFilter implements OASFilter {
    @Override
    public SecurityScheme filterSecurityScheme(final SecurityScheme securityScheme) {
        Config config = ConfigProvider.getConfig();
        String myUrl  = config.getValue("my.url", 
                                        String.class);
        securityScheme.getFlows().
                       getImplicit().
                       setAuthorizationUrl(myUrl);

        return securityScheme;
    }
}

然后将我们的全限定类名作为mp.openapi.filterat 的值,META-INF/microprofile-config.properties如下例所示

mp.openapi.filter=my.filter.DemoOASFilter
my.url=http://some/url

不仅覆盖authorizationUrlOAuthFlow还为我们提供覆盖tokenUrlrefreshUrl等等。除了implicitOAuthFlows还提供了authorizationCode,clientCredentails和其他的。此外,OASFilter接口也让我们可以覆盖更多,例如APIResponsetagserver等。

与集成Microprofile: Config

Config config = ConfigProvider.getConfig();
String myUrl  = config.getValue("my.url", 
                                String.class);

我已经尝试将 URL 配置放在META-INF/microprofile-config.properties上面的示例中,但没有实现,因为它给了我一个java.util.NoSuchElementException.

无论如何environment variablesystem properties都实现了。

docker run -it \
    --env my.url=http://some/url \
    ....

java -Dmy.url=http://some/url -jar  ....
于 2019-02-05T11:37:01.380 回答