#flutter #dart #grpc #grpc-dart
#флаттер #dart #grpc #grpc-dart
Вопрос:
Я разрабатываю приложение flutter, использующее Grpc для подключения к серверу. Некоторым службам требуются дополнительные метаданные для аутентификации, поэтому первое, что приходит мне в голову, — это внедрение перехватчика для добавления метаданных к этим запросам, подобным этому:
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);
}
}
Но я понимаю Caught error: Unsupported operation: Cannot modify unmodifiable map
, потому что CallOptions использует неизменяемую карту.
Первый вопрос: какова наилучшая практика добавления аутентификации к некоторым запросам вместо создания заглушки клиента с этими метаданными?
Второй: как я могу скопировать метаданные из параметров, изменить их и использовать измененный объект?
Ответ №1:
Первый вопрос: какова наилучшая практика добавления аутентификации к некоторым запросам вместо создания заглушки клиента с этими метаданными?
Некоторые библиотеки АУТЕНТИФИКАЦИИ, которые я видел, используют метаданные для предоставления токена / ключа аутентификации и т. Д. Например https://github.com/grpc/grpc-dart/blob/master/lib/src/auth/auth.dart#L43
Поэтому не стесняйтесь добавлять свой пользовательский заголовок аутентификации в метаданные dict. Это можно сделать через перехватчик, как вы делали, или через CallOptions:
final resp = await _grpcClient.someApiCall(req,
options: CallOptions(metadata: {'auth': 'your token'}));
Второй: как я могу скопировать метаданные из параметров, изменить их и использовать измененный объект?
Просто клонируйте предыдущие варианты вызовов с новым значением черезmergedWith
Второй вопрос:
class MyClientInterceptor implements ClientInterceptor {
@override
ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {
var newOptions = options.mergedWith(
CallOptions(
metadata: <String, String>{
'token': 'Some-Token',
}
)
);
return invoker(method, request, newOptions);
}
}