Как создать CallCredentials из SslCredentials и строки токена - PullRequest
0 голосов
/ 02 марта 2019

Я портирую клиент gRPC с python на c #.И клиент python, и клиент c # используют gRPC Framework из grpc.io.

Клиент python использует следующий код для открытия безопасного канала без проверки подлинности, который затем используется для получения строки токена, который затем используется для создания учетных данных вызова с помощью функции grpc.composite_channel_credentials ():

channel = grpc.secure_channel(url_server_address, ssl_creds)
stub = gateway.GatewayStub(channel)

# Acquire access token via password authentication
pw_cmd = gateway.PasswordAuthenticateCmd(account_name=url.username, password=url.password)
auth_rsp = stub.PasswordAuthenticate(pw_cmd)

# Open a secure, authenticated channel
auth_creds = grpc.access_token_call_credentials(auth_rsp.access_token)
composite_creds = grpc.composite_channel_credentials(ssl_creds, auth_creds)
channel = grpc.secure_channel(url_server_address, composite_creds)
stub = gateway.GatewayStub(channel)

В c # я смог скомпилировать определения буфера протокола и соединиться с сгенерированным клиентом для успешного получениятокен доступа:

SslCredentials secureChannel = new SslCredentials(File.ReadAllText(SSLCertificatePath));
Channel channel = new Channel(ServerURL, PortNum, secureChannel);

var client = new GrpcClient(new Grpc.Gateway.GatewayClient(channel));
var response = client.client.PasswordAuthenticate(new PasswordAuthenticateCmd() { AccountName = UserName, Password = UserPassword });

Console.WriteLine(response.AccessToken);

Однако отсюда я не могу найти аналог c # функции grpc.composite_channel_credentials () для получения SslCredentials и строки токена доступа для создания комбинированных учетных данных.

Ни один из приведенных здесь примеров https://grpc.io/docs/guides/auth.html здесь не использует строку токена, и я не смог найти других примеров.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я решил свою проблему с помощью CallCredentials.FromInterceptor ().

Вызов Python grpc.access_token_call_credentials () добавляет запись авторизации к метаданным и устанавливает ее значение «Bearer» + AccessToken, поэтому я простопришлось сделать то же самое:

SslCredentials secureCredentials = new SslCredentials(File.ReadAllText(SSLCertificatePath));
Channel secureChannel = new Channel(ServerURL, PortNum, secureCredentials);

var client = new GrpcClient(new Grpc.Gateway.GatewayClient(secureChannel));
var response = client.client.PasswordAuthenticate(new PasswordAuthenticateCmd() { AccountName = UserName, Password = UserPassword });

var accessTokenCredentials = CallCredentials.FromInterceptor(new AsyncAuthInterceptor((context, metadata) =>
{
    metadata.Add("authorization", "Bearer " + passwordResponse.AccessToken);
    return TaskUtils.CompletedTask;
}));

var authenticatedCredentials = ChannelCredentials.Create(secureCredentials, accessTokenCredentials);
Channel authenticatedChannel = new Channel(hostURL, hostPort, authenticatedCredentials);

Как указал Ян в своем ответе, в пространстве имен Grpc.Auth есть функция, которая делает то же самое, что и функция, которую я написал: https://github.com/grpc/grpc/blob/c5311260fd923079637f5d43bd410ba6de740443/src/csharp/Grpc.Auth/GoogleAuthInterceptors.cs#L58

...