我正在开发一个使用 Grpc 连接到服务器的 flutter 应用程序。有些服务需要额外的元数据进行身份验证,因此我首先想到的是实现一个拦截器以将元数据添加到这些请求中,如下所示:
class MyClientInterceptor implements ClientInterceptor {
@override
ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {
var newOptions = CallOptions.from([options])
..metadata.putIfAbsent('token', () => 'Some-Token');
return invoker(method, request, newOptions);
}
}
Run Code Online (Sandbox Code Playgroud)
但我明白了Caught error: Unsupported operation: Cannot modify unmodifiable map,因为 CallOptions 使用不可修改的映射。
第一个问题:向某些请求添加身份验证而不是使用这些元数据创建客户端存根的最佳实践是什么?
第二:如何从选项中复制元数据,修改它并使用修改后的对象?
注意:我有足够的理由在 TLS 之上添加额外的安全层并使用 SSL 证书。
我想要做的是,在发出 grpc 请求之前,我想加密 grpc 请求并发送类似字节数组的内容。
在谷歌小组中,他们提出了一个想法来执行以下操作(链接:https : //groups.google.com/forum/# ! msg/ grpc-io/ SeD6KjU5yhE/ kzNd0gHgAQAJ)
message PlainChatMessage {
string text = 1;
int ....
}
// define your RPC request and responses using this message
message EncryptedChatMessage
{
bytes encrypted_data = 1;
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上我需要将我所有的 PlainChatMessage 请求加密为加密消息。我该如何实现这样的事情?
我希望有人可以帮助解决我目前正在创建一个适用于 Web 和移动设备的 Flutter 应用程序的问题,并且我想使用 GRPC 和 WebGrpc。使用 Grpc 一切都运行良好,但使用 Web Grpc 时出现错误
if (kIsWeb) {
print("flutter web");
clientChannel =
GrpcWebClientChannel.xhr(Uri.parse('http://192.168.2.146:8880'));
AuthClient(clientChannel).authenticate(AuthenticationRequest()
..login = "Apfel"
..password= "Hello").then((res) => print(res)).catchError((err) => print(err));
} else {
print("flutter mobil");
clientChannel = ClientChannel('192.168.2.146',
port: 3009,
options:
ChannelOptions(credentials: ChannelCredentials.insecure()));
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误预期为“ClientChannel”类型的值,但得到了“GrpcWebClientChannel”类型之一
我正在尝试将 Flutter 应用程序连接到 gRPC 服务器。\n它过去在我的旧笔记本电脑上运行良好,但现在当我尝试向端点发出请求时总是收到此错误:
\ngRPC Error (code: 13, codeName: INTERNAL, message: grpc: error unmarshalling request: string field contains invalid UTF-8, details: [], rawResponse: null)\nRun Code Online (Sandbox Code Playgroud)\n当我使用另一个gRPC客户端(例如bloomRPC)时,调用成功并且我得到了正确的数据。\nFlutter应用程序调用甚至没有到达端点服务(我在那里放了一个println来测试它,它没有打印任何内容)当我从 Flutter 应用程序进行调用时,但在使用bloomRPC 时它确实会打印它)。
\n这是我的客户端连接代码:
\nclass GrpcClient {\n late ClientChannel client;\n static final GrpcClient _connection = GrpcClient._connect();\n\n factory GrpcClient() => _connection;\n \n GrpcClient._connect(){\n client = ClientChannel(\n "10.0.2.2",\n port: 8080,\n options: ChannelOptions(credentials: ChannelCredentials.insecure(), connectionTimeout:Duration(seconds: 10))\n );\n\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我用 运行服务器 GODEBUG=http2debug=2 go run .。当我从 Bloom 拨打电话时得到以下输出:
2021/12/27 22:23:52 http2: Framer …Run Code Online (Sandbox Code Playgroud)