无法从 Google 切换到新的 IAM API

问题描述

据我所知,从 2021 年 7 月 1 日开始,将不再支持在 IAM API 上调用 SignBlob 和 SignJwt,并且可能会失败。 Google 正在弃用以下身份验证方法:iam.googleapis.com 相反,我们现在可以使用:iamcredentials.googleapis.com

我正在尝试切换到新的 API,但是当我发送请求以签署 JWT 时,我收到一个我不知道的错误。谁能帮我这个?这是示例代码错误。 (错误出现在方法“this.getClient().signJwt(request)”上。

public Accesstoken getToken() {
    try {
      ServiceAccountName name = ServiceAccountName.parse(String.format("projects/-/serviceAccounts/%s",this.tenant.getServiceAccount()));
      SignJwtRequest request = SignJwtRequest.newBuilder()
          .setName(name.toString())
          .addAllDelegates(new ArrayList<>())
          .setPayload(getPayload())
          .build();

      SignJwtResponse signJwtResponse = this.getClient()
          .signJwt(request);

      return new Accesstoken(signJwtResponse.getSignedJwt(),DateUtils.addSeconds(new Date(),3600));

    } catch (Exception e) {      
    }
} 

private IamCredentialsClient getClient() throws IOException {
        if (this.iamClient == null) {
            this.iamClient = IamCredentialsClient.create();
        }
        return this.iamClient;
    }

private String getPayload() {
    JsonObject payload = new JsonObject();

    payload.addProperty("iat",System.currentTimeMillis() / 1000);
    payload.addProperty("iss",tenant.getServiceAccount());
    
    payload.addProperty("aud","https://datastore.googleapis.com/google.datastore.v1.Datastore");
    payload.addProperty("sub",tenant.getServiceAccount());

    return payload.toString();
  }

错误文本:

Handler dispatch Failed; nested exception is java.lang.NoClassDefFoundError: io/grpc/internal/ManagedChannelImplBuilder$ChannelBuilderDefaultPortProvider
AppException(error=AppError(code=500,reason=Server error.,message=An unkNown error has occurred.,errors=null,debuggingInfo=null,originalException=org.springframework.web.util.nestedservletexception: Handler dispatch Failed; nested exception is java.lang.NoClassDefFoundError: io/grpc/internal/ManagedChannelImplBuilder$ChannelBuilderDefaultPortProvider),originalException=org.springframework.web.util.nestedservletexception: Handler dispatch Failed; nested exception is java.lang.NoClassDefFoundError: io/grpc/internal/ManagedChannelImplBuilder$ChannelBuilderDefaultPortProvider)
    at org.opengroup.osdu.storage.util.GlobalOtherExceptionMapper.handleGeneralException(GlobalOtherExceptionMapper.java:35)
    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:190)
    at org.springframework.web.method.support.invocableHandlerMethod.invokeForRequest(invocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletinvocableHandlerMethod.invokeAndHandle(ServletinvocableHandlerMethod.java:105)
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:409)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:61)
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141)
    at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80)
    at org.springframework.web.servlet.dispatcherServlet.processHandlerException(dispatcherServlet.java:1299)
...
...
Caused by: org.springframework.web.util.nestedservletexception: Handler dispatch Failed; nested exception is java.lang.NoClassDefFoundError: io/grpc/internal/ManagedChannelImplBuilder$ChannelBuilderDefaultPortProvider
    at org.springframework.web.servlet.dispatcherServlet.dodispatch(dispatcherServlet.java:1055)
    ... 76 more
Caused by: java.lang.NoClassDefFoundError: io/grpc/internal/ManagedChannelImplBuilder$ChannelBuilderDefaultPortProvider
    at io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider.builderForAddress(NettyChannelProvider.java:38)
    at io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider.builderForAddress(NettyChannelProvider.java:24)
    at io.grpc.ManagedChannelBuilder.forAddress(ManagedChannelBuilder.java:39)
    at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:293)
    at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.access$1700(InstantiatingGrpcChannelProvider.java:74)
    at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$1.createSingleChannel(InstantiatingGrpcChannelProvider.java:220)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)