Я тестирую gRP C -Веб-сайт в Blazor Webassembly с аутентификацией и немного попадаю в блок о том, как получить чистый доступ к моему каналу gRP C.
Без аутентификации есть довольно простой и понятный способ, как описано в примере Blazor для grp c -do tnet https://github.com/grpc/grpc-dotnet/tree/master/examples/Blazor.
Предоставление канала:
builder.Services.AddSingleton(services =>
{
// Get the service address from appsettings.json
var config = services.GetRequiredService<IConfiguration>();
var backendUrl = config["BackendUrl"];
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler()));
var channel = GrpcChannel.ForAddress(backendUrl, new GrpcChannelOptions { HttpClient = httpClient });
return channel;
});
Использование в файлах Razor
@inject GrpcChannel Channel
Добавление аутентификации непосредственно в файл бритвы и создание канала там не так либо сложный либо
@inject IAccessTokenProvider AuthenticationService
...
@code {
...
var httpClient = new HttpClient(new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler()));
var tokenResult = await AuthenticationService.RequestAccessToken();
if (tokenResult.TryGetToken(out var token))
{
var _token = token.Value;
var credentials = CallCredentials.FromInterceptor((context, metadata) =>
{
if (!string.IsNullOrEmpty(_token))
{
metadata.Add("Authorization", $"Bearer {_token}");
}
return Task.CompletedTask;
});
//SslCredentials is used here because this channel is using TLS.
//Channels that aren't using TLS should use ChannelCredentials.Insecure instead.
var channel = GrpcChannel.ForAddress(baseUri, new GrpcChannelOptions
{
Credentials = ChannelCredentials.Create(new SslCredentials(), credentials)
});
Но это перемещает большую часть необходимых логик c в файл бритвы. Есть ли способ объединить их и обеспечить аутентифицированный канал GRP c путем инъекции?