我正在尝试访问Arista路由器上的gNMI API。日志含义接口只配置了用户名/密码(admin/admin),没有配置证书。
这个CLI命令返回能力
$ gnmic -a 10.72.47.100:32232 --username admin --password admin --skip-verify capabilities
我使用@grpc/grpc-js
和ts-proto
来生成typescript模型。
我还没能弄清楚如何从node/typescript中进行相同的API调用。
尝试将不安全凭证与呼叫凭证结合使用会产生此错误Error: Cannot compose insecure credentials
import * as grpc from '@grpc/grpc-js';
import * as gnmi from './proto/github.com/openconfig/gnmi/proto/gnmi/gnmi';
const meta = new grpc.Metadata();
meta.add('username', 'admin');
meta.add('password', 'admin');
const channelCredentials = grpc.credentials.createInsecure();
const callCredentials = grpc.credentials.createFromMetadataGenerator( (options, callback) => {
callback(null, meta);
});
const credentials = grpc.credentials.combineChannelCredentials(
channelCredentials,
// callCredentials, <-- ** gives error: Error: Cannot compose insecure credentials **
);
const client = new gnmi.gNMIClient('10.72.47.100:32232', credentials);
const req: gnmi.CapabilityRequest = { extension: [] };
client.capabilities(req,
(error, response) => {
if (error) {
console.error(error);
process.exit(1);
}
console.info(response.gNMIVersion);
})
并且将元传递给调用会给我这个错误Error: 14 UNAVAILABLE: Connection dropped
。我认为这是由于缺少凭据
const meta = new grpc.Metadata();
meta.add('username', 'admin');
meta.add('password', 'admin');
const Credentials = grpc.credentials.createInsecure();
const client = new gnmi.gNMIClient('10.72.47.100:32232', credentials);
const req: gnmi.CapabilityRequest = { extension: [] };
client.capabilities(req, meta
(error, response) => {
if (error) {
console.error(error);
process.exit(1);
}
console.info(response.gNMIVersion);
})
code: 14, details: 'Connection dropped',
metadata: Metadata, stack: 'Error: 14 UNAVAILABLE: Connection dropped
有什么建议吗?
感谢gRPC不允许组合叫凭证与不安全通道凭证,因为叫凭证通常包含敏感信息,只能通过安全连接传输。处理此问题的最简单方法是通过在客户机和服务器上使用安全凭据来使用TLS保护连接。如果这不是一个选项,您也可以将元数据直接传递给每个单独的请求,而不是使用调用凭据。