gRPC(Google Remote Procedure Call)是一个高性能、开源和通用的 RPC 框架,它由 Google 主导开发。gRPC 通常用于微服务架构中,允许服务间以定义明确的方法相互调用。与其他 RPC 系统一样,gRPC 也需要一种机制来保证通信过程中的数据安全性,特别是在服务间进行敏感数据传输时,这就是 gRPC 认证(Authentication)的作用。
gRPC 认证机制
gRPC 认证可以理解为一种确保客户端和服务端通信安全的机制。它的目的是验证通信双方的身份,确保数据在传输过程中不被未经授权的第三方截获或篡改。gRPC 支持多种认证机制,包括:
基于SSL/TLS的传输层安全性
最常见的方式,可以为客户端与服务端之间的通信提供加密,同时还可以用于服务器认证,以及可选的客户端认证(双向TLS认证),所有传输的数据都会被加密,例如官方给出的例子(在 Node.js 中):
const root_cert = fs.readFileSync('path/to/root-cert');
const ssl_creds = grpc.credentials.createSsl(root_cert);
const stub = new helloworld.Greeter('myservice.example.com', ssl_creds);
Token-based 认证
在这种机制中,客户端会获取一个令牌(例如JWT),并在每个请求的元数据中附带这个令牌。服务端在收到请求后会验证这个令牌的有效性。
OAuth 2.0
gRPC 也支持使用 OAuth 2.0 标准进行认证。客户端会获取一个访问令牌,并将其随请求发送给服务端,服务端负责验证令牌的有效性。
自定义认证机制
可以根据具体的应用需求制定认证逻辑,例如用API密钥、签名请求等方式。
无论采用哪种认证机制,gRPC 都提供了相应的接口和方法来实现认证逻辑,你可以在客户端和服务端的代码中设置相应的认证配置。
下面将介绍一个使用基于 SSL/TLS 的认证方式,来实现一个 gRPC 服务和客户端的例子。这种认证方式在生产中是非常常见的,因为它能够提供一个安全的传输层并能够确认服务器的身份。在开始之前,我们先准备一款 gRPC 调试工具。
gRPC 调试工具
为了优化 gRPC 的调试体验,选择一个可靠的调试工具至关重要。这里我比较推荐使用 Apifox —— 一款支持多种协议(如 http、https、WebSocket、Socket、gRPC、Dubbo 等)的全能接口测试工具。下面,我们将通过具体步骤演示如何在 Node.js 中进行 gRPC 认证,并借助 Apifox 进行高效调试。
Node.js 中进行 gRPC 认证
在开始之前,请确保你安装了 Node.js 环境以及 grpc
npm 包。
步骤 1: 生成 SSL/TLS 证书
使用 OpenSSL 生成自签名的 SSL/TLS 证书:
# 生成私钥
openssl genpkey -algorithm RSA -out server.key
# 创建证书签名请求(CSR)
openssl req -new -key server.key -out server.csr
# 生成自签名证书
openssl x509 -req -in server.csr -signkey server.key -out server.crt
步骤 2: 创建 gRPC 服务定义
假设我们有以下的 helloworld.proto
gRPC 服务定义:
// helloworld.proto
syntax = "proto3";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
步骤 3: 实现 gRPC 服务端
在你的 Node.js 应用程序中,创建一个名为 server.js
的文件,并增加以下内容:
// server.js
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const fs = require('fs');
const packageDefinition = protoLoader.loadSync('helloworld.proto');
const grpcObject = grpc.loadPackageDefinition(packageDefinition);
const helloworld = grpcObject.helloworld;
// 实现 proto file 中定义的 Greeter 服务
const sayHello = (call, callback) => {
callback(null, { message: 'Hello, ' + call.request.name });
};
const server = new grpc.Server();
// 添加服务到 gRPC server
server.addService(helloworld.Greeter.service, { sayHello });
// 读取证书和秘钥文件
const serverKey = fs.readFileSync('server.key');
const serverCrt = fs.readFileSync('server.crt');
// 定义服务器的 SSL 证书和键
const serverCredentials = grpc.ServerCredentials.createSsl(null, [{
cert_chain: serverCrt,
private_key: serverKey
}], true);
// 启动 gRPC server 并添加 SSL 认证
server.bindAsync('0.0.0.0:50051', serverCredentials, (error, port) => {
if (error) {
console.error(error);
return;
}
console.log(`Server running at https://0.0.0.0:${port}`);
server.start();
});
步骤 4: 创建 gRPC 客户端
创建一个名为 client.js
的文件,并增加以下内容:
// client.js
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const fs = require('fs');
const packageDefinition = protoLoader.loadSync('helloworld.proto');
const grpcObject = grpc.loadPackageDefinition(packageDefinition);
const helloworld = grpcObject.helloworld;
// 读取证书文件
const clientCrt = fs.readFileSync('server.crt');
// 创建 SSL 证书
const credentials = grpc.credentials.createSsl(clientCrt);
// 创建 gRPC 客户端
const client = new helloworld.Greeter('localhost:50051', credentials);
// 向 gRPC 服务端发起请求
client.sayHello({ name: 'World' }, (error, response) => {
if (error) {
console.error(error);
return;
}
console.log('Greeting:', response.message);
});
步骤 5: 运行 gRPC 服务端和客户端
首先,启动服务:
node server.js
如果一切顺利,你应当在控制台看到一个提示说明服务正在运行。
然后,在另一个终端窗口运行客户端:
node client.js
客户端会向服务端发起 SayHello
的请求,并打印出服务端的响应。
完成!
这个例子演示了如何在 Node.js 中使用 SSL/TLS 证书实现基本的 gRPC 认证。在生产系统中,你应该使用由权威证书颁发机构签发的证书,而非自签名的证书。
使用 Apifox 调试 gRPC
目前,市面上能够兼容 gRPC 接口的调试与管理工具相对有限,但值得注意的是,Apifox 作为业界领先的接口管理工具,已经支持 gRPC 接口的调试和管理功能,这一功能的推出使得在微服务架构中广泛应用的 gRPC 变得更加便捷。Apifox 提供全面的兼容性,涵盖 gRPC 的四种调用类型:
- Unary:一元调用
- Server Streaming:服务端流
- Client Streming:客户端流
- Bidirectional Streaming:双向流
下文将通过一个示例场景简要演示如何在 Apifox 中新建 gRPC 项目并针对接口发起调试。
步骤1:新建 gRPC 项目
在 Apifox 中登录并新建一个 gRPC 项目,点击“新建项目”按钮,选择 gRPC 类型,填写项目名称后轻点“新建”按钮。
步骤2:导入.proto
文件
导入定义 gRPC 接口所使用的服务、方法和消息的 .proto
文件。你可以将文件拖拽至其中或使用文件在线 URL 完成导入。
步骤3:调试 gRPC
文件导入后,Apifox 将基于 .proto
文件内容生成对应的接口信息,然后就可以进行调试。
通过这些简单的步骤,你可以在 Apifox 中方便地管理和调试你的 gRPC 项目。这个功能非常强大,更具体的你可以访问 Apifox 的 gRPC 帮助文档,赶快去试试吧!
总结
在 Node.js 中实现 gRPC 认证的过程涉及生成 SSL/TLS 证书、定义 gRPC 服务接口、编写服务端和客户端代码,并配置服务端和客户端使用 SSL/TLS 保护通信。这种认证机制确保了数据的加密传输和服务的安全身份验证,是构建安全微服务应用的关键步骤。
知识拓展:
参考链接:
- gRPC 官方文档:https://grpc.io/docs/guides/auth/