OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动

我的应用程序包括:

  • 后端/资源服务器
  • UI Webapp
  • 钥匙斗篷

UI正在使用具有授权码授予流程的keycloak客户端通过RESTful API与后端服务器进行通信。一切正常。

现在,我需要使用系统/服务帐户(通常具有比用户更多的权限)访问后端资源的其他可能性。您将如何实施此要求?我认为客户端凭据流在这里很有用。

Spring Boot" title="Spring Boot">Spring Boot的keycloak客户端中可以使用OAuth2客户端凭据流吗?我发现了一些示例,这些示例使用Spring Security

OAuth2客户端功能来实现客户端凭证流,但是这感觉很奇怪,因为我已经将keycloak客户端用于OAuth了。

回答:

感谢您的回答,这对我很有帮助。现在,在我的UI

Web应用程序中,我可以通过使用经过身份验证的用户OAuth2令牌或使用我的UI服务帐户的客户端凭据流中的令牌与后端进行通信。每种方法都有自己的RestTemplate,首先是通过整合keycloak完成,第二个是Spring

Security中的OAuth2作为解释做此。

回答:

在@ dmitri-algazin之后,您可以实现工作流,基本上有两个选择:

  1. 如果您想涵盖Keycloak之外的其他IDM,该解决方案以某种方式解决了“ 单一职责”原则,我会使用RestTemplate。在下面可以找到变量:
    //Constants

    @Value("${keycloak.url}")

    private String keycloakUrl;

    @Value("${keycloak.realm}")

    private String keycloakRealm;

    @Value("${keycloak.client_id}")

    private String keycloakClientId;

    RestTemplate restTemplate = new RestTemplate();

    private static final String BEARER = "BEARER ";

首先,您需要生成访问令牌:

    @Override

public AccessTokenResponse login(KeycloakUser user) throws NotAuthorizedException {

try {

String uri = keycloakUrl + "/realms/" + keycloakRealm +

"/protocol/openid-connect/token";

String data = "grant_type=password&username="+

user.getUsername()+"&password="+user.getPassword()+"&client_id="+

keycloakClientId;

HttpHeaders headers = new HttpHeaders();

headers.set("Content-Type", "application/x-www-form-urlencoded");

HttpEntity<String> entity = new HttpEntity<String>(data, headers);

ResponseEntity<AccessTokenResponse> response = restTemplate.exchange(uri,

HttpMethod.POST, entity, AccessTokenResponse.class);

if (response.getStatusCode().value() != HttpStatus.SC_OK) {

log.error("Unauthorised access to protected resource", response.getStatusCode().value());

throw new NotAuthorizedException("Unauthorised access to protected resource");

}

return response.getBody();

} catch (Exception ex) {

log.error("Unauthorised access to protected resource", ex);

throw new NotAuthorizedException("Unauthorised access to protected resource");

}

}

然后,使用令牌可以从用户检索信息:

    @Override

public String user(String authToken) throws NotAuthorizedException {

if (! authToken.toUpperCase().startsWith(BEARER)) {

throw new NotAuthorizedException("Invalid OAuth Header. Missing Bearer prefix");

}

HttpHeaders headers = new HttpHeaders();

headers.set("Authorization", authToken);

HttpEntity<String> entity = new HttpEntity<>(headers);

ResponseEntity<AccessToken> response = restTemplate.exchange(

keycloakUrl + "/realms/" + keycloakRealm + "/protocol/openid-connect/userinfo",

HttpMethod.POST,

entity,

AccessToken.class);

if (response.getStatusCode().value() != HttpStatus.SC_OK) {

log.error("OAuth2 Authentication failure. "

+ "Invalid OAuth Token supplied in Authorization Header on Request. Code {}", response.getStatusCode().value());

throw new NotAuthorizedException("OAuth2 Authentication failure. "

+ "Invalid OAuth Token supplied in Authorization Header on Request.");

}

log.debug("User info: {}", response.getBody().getPreferredUsername());

return response.getBody().getPreferredUsername();

}

您可以将该URL替换为@ dimitri-algazin提供的URL,以检索所有用户信息。

  1. 可以使用Keycloak依赖项:
        <!-- keycloak -->

    <dependency>

    <groupId>org.keycloak</groupId>

    <artifactId>keycloak-admin-client</artifactId>

    <version>3.4.3.Final</version>

    </dependency>

    <dependency>

    <groupId>org.jboss.resteasy</groupId>

    <artifactId>resteasy-client</artifactId>

    <version>3.1.4.Final</version>

    </dependency>

并使用这些类来生成令牌:

            Keycloak keycloak = KeycloakBuilder

.builder()

.serverUrl(keycloakUrl)

.realm(keycloakRealm)

.username(user.getUsername())

.password(user.getPassword())

.clientId(keycloakClientId)

.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())

.build();

return keycloak.tokenManager().getAccessToken();

例子摘自这里。我们还将映像上传到Docker

Hub,以促进与Keycloak的交互。因此,我们从选项2)开始。目前,我们正在涵盖其他IdM,我们选择了选项1),以避免包括额外的依赖项。结论:

如果您坚持使用Keycloak,我会 ,因为类包含Keycloak工具的额外功能。我会

进行进一步介绍,并使用其他OAuth 2.0工具。

以上是 OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动 的全部内容, 来源链接: utcz.com/qa/411776.html

回到顶部