Node.js 中进行 gRPC 认证(authentication)

在 Node.js 中实现 gRPC 认证的过程涉及生成 SSL/TLS 证书、定义 gRPC 服务接口、编写服务端和客户端代码,并配置服务端和客户端使用 SSL/TLS 保护通信。这种认证机制确保了数据的加密传输和服务的安全身份验证,是构建安全微服务应用的关键步骤。

用 Apifox,节省研发团队的每一分钟

Node.js 中进行 gRPC 认证(authentication)

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 Apifox
目录

gRPC(Google Remote Procedure Call)是一个高性能、开源和通用的 RPC 框架,它由 Google 主导开发。gRPC 通常用于微服务架构中,允许服务间以定义明确的方法相互调用。与其他 RPC 系统一样,gRPC 也需要一种机制来保证通信过程中的数据安全性,特别是在服务间进行敏感数据传输时,这就是 gRPC 认证(Authentication)的作用。

Node.js 中进行 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 进行高效调试。

gRPC 调试工具

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 认证。在生产系统中,你应该使用由权威证书颁发机构签发的证书,而非自签名的证书。

💡
额外的安全措施:例如证书撤销列表 (CRL) 或者证书透明度 (CT),可能也是需要考虑的。此外,记得确保证书的私钥不会泄露,并且只存储在可信的系统上。

使用 Apifox 调试 gRPC

目前,市面上能够兼容 gRPC 接口的调试与管理工具相对有限,但值得注意的是,Apifox 作为业界领先的接口管理工具,已经支持 gRPC 接口的调试和管理功能,这一功能的推出使得在微服务架构中广泛应用的 gRPC 变得更加便捷。Apifox 提供全面的兼容性,涵盖 gRPC 的四种调用类型:

  • Unary:一元调用
  • Server Streaming:服务端流
  • Client Streming:客户端流
  • Bidirectional Streaming:双向流
    下文将通过一个示例场景简要演示如何在 Apifox 中新建 gRPC 项目并针对接口发起调试。

步骤1:新建 gRPC 项目

Apifox 中登录并新建一个 gRPC 项目,点击“新建项目”按钮,选择 gRPC 类型,填写项目名称后轻点“新建”按钮。

Apifox 新建 gRPC 项目

步骤2:导入.proto文件

导入定义 gRPC 接口所使用的服务、方法和消息的 .proto 文件。你可以将文件拖拽至其中或使用文件在线 URL 完成导入。

Apifox 导入.proto文件

步骤3:调试 gRPC

文件导入后,Apifox 将基于 .proto 文件内容生成对应的接口信息,然后就可以进行调试。

Apifox 调试 gRPC

通过这些简单的步骤,你可以在 Apifox 中方便地管理和调试你的 gRPC 项目。这个功能非常强大,更具体的你可以访问 Apifox 的 gRPC 帮助文档,赶快去试试吧!

Apifox 接口调试工具

总结

在 Node.js 中实现 gRPC 认证的过程涉及生成 SSL/TLS 证书、定义 gRPC 服务接口、编写服务端和客户端代码,并配置服务端和客户端使用 SSL/TLS 保护通信。这种认证机制确保了数据的加密传输和服务的安全身份验证,是构建安全微服务应用的关键步骤。

知识拓展:


参考链接: