开发学院

您的位置:首页>教程>正文

教程正文

gRPC 认证

gRPC 认证

  gRPC被设计成与各种认证机制一起工作,使得安全地使用gRPC与其他系统通话变得容易。你可以使用我们支持的机制:SSL / TLS,不管有没有基于谷歌令牌的认证:或者你可以通过扩展我们提供的代码来插入你自己的认证系统。

  gRPC还提供了一个简单的身份验证API,允许您在创建通道或进行呼叫时提供所有必要的身份验证信息作为凭据。

支持的认证机制

  gRPC内置了以下认证机制:

  •   SSL/TLS: gRPC集成了SSL/TLS,并使用SSL/TLS来验证服务器,以及加密客户端和服务器之间交换的所有数据。客户端可以使用可选机制来提供相互身份验证的证书。

  •   基于令牌的谷歌认证: gRPC提供了一种通用机制(如下所述),将基于metadata的凭据附加到请求和响应中。在通过gRPC访问Google APIs时,为获取访问令牌(通常是OAuth2令牌)提供了额外的支持,用于某些授权流:您可以在下面的代码示例中看到这是如何工作的。一般来说,这种机制必须与通道上的SSL/TLS一起使用:谷歌不允许没有SSL/TLS的连接,大多数gRPC语言实现都不允许您在未加密的通道上发送凭证。

  警告:谷歌凭据只能用于连接到谷歌服务,向非谷歌服务发送谷歌发布的OAuth2令牌可能会导致该令牌被盗,并被用来冒充谷歌服务的客户端。

认证API

  gRPC提供了一套统一的凭据对象概念的简单身份验证API,可在创建整个gRPC通道或单独调用时使用。

凭证类型

  凭据有两种类型:

  •   Channel credentials:附加到通道,例如SSL凭证。

  •   Call credentials:这些附加到调用(或C++中的ClientContext )上。

  您也可以在aCompositeChannelCredentials中组合这些凭据,例如,允许您指定频道的SSL详细信息以及频道上每次请求的调用凭据。 CompositeChannelCredentials将 ChannelCredentials和CallCredentials关联起来,结果将发送与合成CallCredentials相关联的身份验证数据,并在信道上进行每次呼叫。

  例如,您可以从SslCredentials和AccessTokenCredentials创建通道凭据。当应用于信道时,结果将为该信道上的每个呼叫发送适当的接入令牌。

  单个CallCredentials也可以使用CompositeCallCredentials组成。当在呼叫中使用时,产生的CallCredentials将触发与两个CallCredentials关联的身份验证数据的发送。

使用客户端SSL/TLS

  现在让我们看看Credentials如何与我们支持的授权机制一起工作。这是最简单的身份验证场景,其中客户端只想对服务器进行身份验证并加密所有数据。这个例子是用C++编写的,但是API对所有语言都是相似的:你可以在下面的例子部分看到如何用更多的语言启用SSL/TLS。

// Create a default SSL ChannelCredentials object.
auto channel_creds = grpc::SslCredentials(grpc::SslCredentialsOptions());
// Create a channel using the credentials created in the previous step.
auto channel = grpc::CreateChannel(server_name, channel_creds);
// Create a stub on the channel.
std::unique_ptr<Greeter::Stub> stub(Greeter::NewStub(channel));
// Make actual RPC calls on the stub.
grpc::Status s = stub->sayHello(&context, *request, response);

  对于高级用例,如修改根CA或使用客户端证书,可以在传递给工厂方法的SslCredentialsOptions参数中设置相应的选项。

使用基于谷歌令牌的身份验证

 gRPC应用程序可以使用一个简单的API来创建一个凭证,该凭证可以在各种部署场景中与Google一起进行身份验证。同样,我们的例子使用C++代码,但你可以在后面找到其他语言的例子。

auto creds = grpc::GoogleDefaultCredentials();
// Create a channel, stub and make RPC calls (same as in the previous example)
auto channel = grpc::CreateChannel(server_name, creds);
std::unique_ptr<Greeter::Stub> stub(Greeter::NewStub(channel));
grpc::Status s = stub->sayHello(&context, *request, response);

  此通道凭据对象适用于使用Service Accounts的应用程序以及在Google计算引擎( GCE )中运行的应用程序。在前一种情况下,服务帐户的私钥是从环境变量GOOGLE_APPLICATION_CREDENTIALS中加载的。密钥用于生成承载令牌,这些令牌被附加到相应信道上的每个传出的RPC。

  对于在GCE中运行的应用程序,可以在VM设置期间配置默认服务帐户和相应的OAuth2范围。在运行时,此凭据处理与身份验证系统的通信,以获得OAuth2访问令牌,并将它们附加到相应通道上的每个传出的RPC。

扩展gRPC以支持其他身份验证机制

  Credentials插件API允许开发人员插入他们自己的凭据类型。这包括:

  •   MetadataCredentialsPlugin抽象类,它包含虚拟GetMetadata方法,需要由开发人员创建的子类实现。

  •   MetadataCredentialsPlugin函数,用于从MetaDataCredentialSplugin创建调用凭据。

  下面是一个简单的凭据插件的例子,它在自定义头中设置了一个身份验证票证。

class MyCustomAuthenticator : public grpc::MetadataCredentialsPlugin {
 public:
  MyCustomAuthenticator(const grpc::string& ticket) : ticket_(ticket) {}

  grpc::Status GetMetadata(
      grpc::string_ref service_url, grpc::string_ref method_name,
      const grpc::AuthContext& channel_auth_context,
      std::multimap<grpc::string, grpc::string>* metadata) override {
    metadata->insert(std::make_pair("x-custom-auth-ticket", ticket_));
    return grpc::Status::OK;
  }

 private:
  grpc::string ticket_;
};

auto call_creds = grpc::MetadataCredentialsFromPlugin(
    std::unique_ptr<grpc::MetadataCredentialsPlugin>(
        new MyCustomAuthenticator("super-secret-ticket")));

  通过在核心层插入gRPC凭据实现,可以实现更深入的集成。gRPC内部还允许使用其他加密机制来切换SSL/TLS。