使用API​​密钥在Android上通过GRPC验证Google Cloud Speech

我已经设法通过GRPC使用流媒体模式的服务帐户为我的 Android应用程序运行Google Cloud Speech.但是,根据我所读到的内容,出于安全原因,我不应该在其中部署具有这些凭据的Android应用程序(当前存储为资源中的JSON文件).正确的是创建一个API密钥,如下所述: https://cloud.google.com/speech/docs/common/auth

这允许我限制对我的特定Android应用的访问.但是,我一直无法找到如何使用GRPC的API密钥.我目前正在从JSON文件创建一个GoogleCredentials实例,这很好用.如何从API密钥获取凭证对象?

解决方法

您可以使用API​​密钥尝试此操作

final ManagedChannel channel = new OkHttpChannelProvider()
    .builderForAddress(HOSTNAME,PORT)
    .nameResolverFactory(new DnsNameResolverProvider())
    .intercept(new Interceptor(API_KEY))
    .build();
speechStub = SpeechGrpc.newStub(channel);

private static final class Interceptor implements ClientInterceptor {
  private final String apiKey;
  private static Metadata.Key<String> API_KEY_HEADER =
      Metadata.Key.of("x-goog-api-key",Metadata.ASCII_STRING_MARSHALLER);
  public Interceptor(String apiKey) {
    this.apiKey = apiKey;
  }
  @Override
  public <ReqT,RespT> ClientCall<ReqT,RespT> interceptCall(
      MethodDescriptor<ReqT,RespT> method,CallOptions callOptions,Channel next) {
    ClientCall<ReqT,RespT> call = next.newCall(method,callOptions);
    call = new ForwardingClientCall.SimpleForwardingClientCall<ReqT,RespT>(call) {
      @Override
      public void start(Listener<RespT> responseListener,Metadata headers) {
        if (apiKey != null && !apiKey.isEmpty()) {
          headers.put(API_KEY_HEADER,apiKey);
        }
        super.start(responseListener,headers);
      }
    };
    return call;
  }
}

相关文章

gRPC 前言 为什么使用gRPC 传输协议 传输效率 性能消耗 gRPC...
参考文章: 1.&#160;https://www.cnblogs.com/kaixinyufe...
今天给大家翻译一篇由ASP.NET首席开发工程师 &quot;Jame...
上一篇文章我带着大家体验了一把《 &quot;ASP.NET Core ...
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着...
这篇笔记主要是记录学习历程而不是怎么用~,以及protobuffe...