当前位置: 首页 > 知识库问答 >
问题:

使用swagger生成的Api客户端使用OAuth2安全的REST API

张献
2023-03-14

我正在尝试使用swagger codegen maven插件(版本3.0.0)生成的ApiClient,从我的Spring Boot应用程序中使用OAuth2安全的REST API。身份验证服务器(keycoat)提供了一个JWT和刷新令牌,但我不知道如何最好地处理bean中的令牌。现在我的豆子看起来像这样:

@Configuration
public class SomeApiClientConfiguration {

    @Bean
    public SomeApi someApi() {
        return new SomeApi(apiClient());
    }

    @Bean
    public ApiClient apiClient() {
        ApiClient apiClient = new ApiClient();

        OAuth oAuth = (OAuth) apiClient.getAuthentication("auth");
        oAuth.setAccessToken("");

        return apiClient;
    }
}

问题是:获取令牌和处理刷新令牌的最佳方法是什么?

编辑:为了获得令牌,我想使用客户端ID、用户名和密码。授予类型:密码凭据。

最好,

马克

共有1个答案

华欣怡
2023-03-14

我解决了这个问题,并想分享解决方案以供将来参考:

这是我的SomeApiClientConfiguration:

@Configuration
public class SomeApiClientConfiguration{

    @Value("${app.api.url}")
    private String apiURL;

    @Bean
    public SomeApi someApi(OAuth2RestTemplate restTemplate) {
        return new SomeApi(apiClient(restTemplate));
    }

    @Bean
    public ApiClient apiClient(OAuth2RestTemplate restTemplate) {
        var apiClient = new ApiClient(restTemplate);
        apiClient.setBasePath(apiURL);
        return apiClient;
    }
}

另外,我需要一个SomeApiAuth2Config类,如下所示:

@Configuration
@EnableOAuth2Client
public class SomeApiOAuth2Config {

    @Value("${app.api.client-id}")
    private String clientId;

    @Value("${app.api.token-endpoint}")
    private String accessTokenUri;

    @Value("${app.api.name}")
    private String username;

    @Value("${app.api.password}")
    private String password;

    @Bean
    public ClientHttpRequestFactory httpRequestFactory() {
        return new HttpComponentsClientHttpRequestFactory(httpClient());
    }

    @Bean
    public HttpClient httpClient() {
        var connectionManager = new PoolingHttpClientConnectionManager();
        var maxPoolSize = 1;
        connectionManager.setMaxTotal(maxPoolSize);
        // This client is for internal connections so only one route is expected
        connectionManager.setDefaultMaxPerRoute(maxPoolSize);
        return HttpClientBuilder.create().setConnectionManager(connectionManager).build();
    }

    @Bean
    public OAuth2ProtectedResourceDetails oauth2ProtectedResourceDetails() {
        var details = new ResourceOwnerPasswordResourceDetails();
        var resourceId = "";
        details.setId(resourceId);
        details.setClientId(clientId);
        var clientSecret = "";
        details.setClientSecret(clientSecret);
        details.setAccessTokenUri(accessTokenUri);
        details.setClientAuthenticationScheme(AuthenticationScheme.form);
        return details;
    }

    @Bean
    public AccessTokenProvider accessTokenProvider() {
        var tokenProvider = new ResourceOwnerPasswordAccessTokenProvider();
        tokenProvider.setRequestFactory(httpRequestFactory());
        return new AccessTokenProviderChain(
            Collections.<AccessTokenProvider>singletonList(tokenProvider)
        );
    }

    @Bean
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public OAuth2RestTemplate restTemplate(@Qualifier("oauth2ClientContext") OAuth2ClientContext oauth2ClientContext) {
    var template = new OAuth2RestTemplate(oauth2ProtectedResourceDetails(),     oauth2ClientContext);
        template.setRequestFactory(httpRequestFactory());
        template.setAccessTokenProvider(accessTokenProvider());
        template.getOAuth2ClientContext().getAccessTokenRequest().set("username", username);
        template.getOAuth2ClientContext().getAccessTokenRequest().set("password", password);
        return template;
    }
}
 类似资料:
  • 我有一个使用JWT进行身份验证的RESTful API。我从客户端收到的第一个调用是 /login调用,具有以下有效负载(没有标头) 服务器验证用户是否已注册,然后将签名的JWT返回给客户端,以便在下一次调用中接收。 我想知道这是否足够安全。我不会在任何地方检查客户端是否向我发送了客户端id/客户端密码(如在OAuth中),因此我无法验证此调用是否来自我的webapp/应用程序,或者是否是我不知道

  • 我正在为Kubernetes使用fabric8 java客户端库。我无法找到对容器执行更新操作的最佳方法。基本上,我想做的是,我已经创建了一个容器映像为“nginx”的pod,现在我想更新这个映像为“nginx:1.16.1”。 我想做的是

  • 我试图在我的资源服务器上配置Swagger身份验证,以便我可以根据我的授权服务器进行身份验证。 我将资源服务器和授权服务器分开。它们都使用不同的端口在我的本地主机上启动。 端口8083上的资源服务器 每当我试图“授权”时,就会出现CORS问题。 我从另一个网站分叉了一个项目作为我的测试场地。下面是分叉项目。 https://github.com/cbriarnold/oauth2-spring-b

  • 我开发了一个安全的Spring BootRest Api,使用基本的auth头,现在我试图添加SSL来防止中间人攻击,就像Spring教程建议的那样,所以我通过生成密钥库来激活Spring的SSL安全性。我添加到资源中的JKS。服务器工作正常。 现在我有了一个JavaFX客户机,在那里我使用Unirest Api来执行请求,但我不知道如何更新我的客户机以成功地向我的服务器执行get/post请求。

  • 我想使用swagger-codegen生成我的假客户端代码,但我找不到能够引导我这样做的文档。 我有一个使用spring cloud的微服务,几个使用spring-cloud-feign接口请求数据的API服务。我希望我能生成feign客户端代码。 我很困惑如何生成我所有的代码?似乎几乎没有指南、文档或演示?

  • 我需要在eclipse中使用with swagger codegen插件(用于maven)生成服务器存根代码。你能帮我怎么做吗?以及需要什么配置(在pom.xml中)。