程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动?

开发过程中遇到OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动的问题如何解决?下面主要结合日常开发的经验,给出你关于OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动的解决方法建议,希望对你解决OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动有所启发或帮助;

在@ 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, 
                    httpR_141_11845@ethod.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", 
                httpR_141_11845@ethod.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),以避免包括额外的依赖项。结论:

解决方法

我的应用程序包括:

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

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

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

在Spring Boot的keycloak客户端中可以使用OAuth2客户端凭据流吗?我发现了一些示例,这些示例使用Spring Security
OAuth2客户端功能来实现客户端凭证流,但是这感觉很奇怪,因为我已经将keycloak客户端用于OAuth了。

编辑:解决方案

感谢您的回答,这对我很有帮助。现在,在我的UI
Web应用程序中,我可以通过使用经过身份验证的用户OAuth2令牌或使用我的UI服务帐户的客户端凭据流中的令牌与后端进行通信。每种方法都有自己的RestTemplate,首先是通过整合keycloak完成,第二个是Spring
Security中的OAuth2作为解释做此。

大佬总结

以上是大佬教程为你收集整理的OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动全部内容,希望文章能够帮你解决OAuth2客户端凭据通过Spring Boot Keycloak集成进行流动所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。