【问题标题】:JWT Token Creation In Java Using SAP Cloud Security使用 SAP Cloud Security 在 Java 中创建 JWT 令牌
【发布时间】:2021-11-01 17:40:36
【问题描述】:

我无法使用 SAP Cloud SDK 在 Java SpringBoot 应用程序中生成 JWT 访问令牌。

以下是步骤-

  1. 使用服务密钥在 SAP Cloud Platform Cockpit 中使用计划 apiaccess 创建 xsuaa 服务实例。

  2. 服务密钥包含将用于生成访问令牌的 clientid、clientsecret 和 url。

  3. 尝试在 Postman 中生成访问令牌。成功如下图。

  4. 切换到 Java 应用程序。 Java 应用是 SAP Cloud Platform 上基于 Spring 的项目。

  5. 下面是生成访问令牌的java代码-

    import java.net.URI; import java.net.URISyntaxException;
    
    
    import org.springframework.stereotype.Service;
    
    import com.sap.cloud.security.xsuaa.client.ClientCredentials;
    import com.sap.cloud.security.xsuaa.client.DefaultOAuth2TokenService;
    import com.sap.cloud.security.xsuaa.client.XsuaaDefaultEndpoints;
    import com.sap.cloud.security.xsuaa.tokenflows.TokenFlowException;
    import com.sap.cloud.security.xsuaa.tokenflows.XsuaaTokenFlows;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    @Service
    public class UserManagement {
        private String authURL = "https://{subdomain}.authentication.eu10.hana.ondemand.com";
        private String clientID = "**";
        private String clientSecret = "***";
    
    
        public String generateJWTToken() {
    
            try {
    
                URI authUri = new URI(authURL);
    
                System.out.println(authURL);
                System.out.println(authUri);
                XsuaaTokenFlows tokenFlows = new XsuaaTokenFlows(new DefaultOAuth2TokenService(),
                        new XsuaaDefaultEndpoints(authUri.toString()), new ClientCredentials(clientID, clientSecret));
    
                System.out.println(tokenFlows.toString());
    
                String jwtToken = tokenFlows.clientCredentialsTokenFlow().execute().getAccessToken();
    
                return jwtToken;
            }catch (TokenFlowException e) {
                log.error("Token Flow Exception found ", e);
                throw new BusinessException(ExceptionEnum.TOKEN_FLOW_ERROR);
            } catch (URISyntaxException e) {
                log.error("URI Syntax Exception found ", e);
                throw new BusinessException(ExceptionEnum.URI_PARSE_ERROR);
            }
    
    }
    
  6. 我在eclipse中运行应用程序,下面是错误:

     https://{subdomain}.authentication.eu10.hana.ondemand.com
     https://{subdomain}.authentication.eu10.hana.ondemand.com
     com.sap.cloud.security.xsuaa.tokenflows.XsuaaTokenFlows@b3fea34
     2021-09-03 16:14:27.567 ERROR 15700 --- [nio-8081-exec-1]
     c.b.s.a.service.imp.UserManagement       : Token Flow Exception found 
    
     com.sap.cloud.security.xsuaa.tokenflows.TokenFlowException: Error
     requesting technical user token with grant_type 'client_credentials':
     Unexpected error retrieving JWT token:
     rb-app-lib-d.authentication.eu10.hana.ondemand.com     at
     com.sap.cloud.security.xsuaa.tokenflows.ClientCredentialsTokenFlow.requestTechnicalUserToken(ClientCredentialsTokenFlow.java:187)
        at
     com.sap.cloud.security.xsuaa.tokenflows.ClientCredentialsTokenFlow.execute(ClientCredentialsTokenFlow.java:139)
        at
     com.bosch.sbs.applibrary.service.imp.UserManagement.generateJWTToken(UserManagement.java:49)
        at
     com.bosch.sbs.applibrary.controller.UserController.testisds(UserController.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at
     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at
     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)     at
     org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
        at
     org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
        at
     org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
        at
     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
        at
     org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at
     org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at
     org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)
        at
     org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
        at
     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at
     org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)     at
     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)     at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     com.sap.cloud.sdk.cloudplatform.servlet.RequestAccessorFilter.lambda$doFilter$1(RequestAccessorFilter.java:75)
        at
     com.sap.cloud.sdk.cloudplatform.thread.AbstractThreadContextExecutor.lambda$execute$0(AbstractThreadContextExecutor.java:317)
        at
     com.sap.cloud.sdk.cloudplatform.security.SecurityContextThreadContextDecorator.lambda$decorateCallable$2(SecurityContextThreadContextDecorator.java:51)
        at
     com.sap.cloud.sdk.cloudplatform.thread.ThreadContextCallable.call(ThreadContextCallable.java:225)
        at
     com.sap.cloud.sdk.cloudplatform.thread.AbstractThreadContextExecutor.execute(AbstractThreadContextExecutor.java:319)
        at
     com.sap.cloud.sdk.cloudplatform.servlet.RequestAccessorFilter.doFilter(RequestAccessorFilter.java:75)
        at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)
        at
     org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
        at
     org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
        at
     org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
        at
     org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
        at
     org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
        at
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
        at
     org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
        at
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
        at
     org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
        at
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
        at
     org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
        at
     org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
        at
     org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
        at
     org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
        at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at
     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at
     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at
     org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at
     org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at
     org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
        at
     org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
        at
     org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at
     org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at
     org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
        at
     org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
        at
     org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at
     org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
        at
     org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
        at
     org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at
     java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at
     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at
     org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748) Caused by:
     com.sap.cloud.security.xsuaa.client.OAuth2ServiceException: Unexpected
     error retrieving JWT token:
     rb-app-lib-d.authentication.eu10.hana.ondemand.com     at
     com.sap.cloud.security.xsuaa.client.DefaultOAuth2TokenService.executeRequest(DefaultOAuth2TokenService.java:82)
        at
     com.sap.cloud.security.xsuaa.client.DefaultOAuth2TokenService.requestAccessToken(DefaultOAuth2TokenService.java:59)
        at
     com.sap.cloud.security.xsuaa.client.AbstractOAuth2TokenService.getAndCacheToken(AbstractOAuth2TokenService.java:299)
        at
     com.sap.cloud.security.xsuaa.client.AbstractOAuth2TokenService.getOrRequestAccessToken(AbstractOAuth2TokenService.java:257)
        at
     com.sap.cloud.security.xsuaa.client.AbstractOAuth2TokenService.getOAuth2TokenResponse(AbstractOAuth2TokenService.java:246)
        at
     com.sap.cloud.security.xsuaa.client.AbstractOAuth2TokenService.retrieveAccessTokenViaClientCredentialsGrant(AbstractOAuth2TokenService.java:106)
        at
     com.sap.cloud.security.xsuaa.tokenflows.ClientCredentialsTokenFlow.requestTechnicalUserToken(ClientCredentialsTokenFlow.java:181)
        ... 99 common frames omitted
    

我想先尝试在 Eclipse 中本地生成访问令牌。我确信认证 url、clientid 和 clientsecret 值是正确的。

我不明白为什么在 Postman 中,我可以直接使用 url、clientid 和 clientsecret 生成访问令牌,而在 java 中却失败了。

【问题讨论】:

  • 此问题与 SAP Cloud SDK 无关,因为您直接使用 XSUAA 安全库。您能否直接在安全库的repo 上创建一个 github 问题以获取他们的意见?

标签: java spring-boot access-token sap-cloud-platform


【解决方案1】:

如果您的应用程序不在代理之后,上述过程可以正常工作。我将此应用程序部署到 SAP Cloud,它运行良好。本地测试中的问题是我的组织设置的代理。因此,我要结束这个问题。谢谢!

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2017-05-28
    • 2018-10-29
    • 2019-12-09
    • 1970-01-01
    • 2014-07-03
    相关资源
    最近更新 更多