Как использовать code_verifier в методе Google.API ExchangeCodeForTokenAsyn c - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь внедрить Google Oauth в наше приложение. Я использую клиентскую библиотеку Google. Net "Версия Google.Apis 1.45 (пакет NuGet)".

После получения кода из браузера я хочу отправить code_verifier также для получения токена. Я использую класс GoogleAuthorizationCodeFlow "ExchangeCodeForTokenAsyn c" для получения токена. Если я не использую "code_challenge", тогда я получаю токен успешно. Но когда я пытаюсь использовать «code_challenge», я получаю следующее сообщение об ошибке:

Ошибка: «invalid_grant», Описание: «Проверяющий код отсутствует». Uri: «».

Пожалуйста, проверьте мой код.

var clientSecrets = new ClientSecrets
                {
                    ClientId = _clientAppDetails.ClientID,
                    ClientSecret = _clientAppDetails.ClientSecret
                };

 var credential = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = clientSecrets,
                Scopes = new[] { GoogleScope.ImapAndSmtp.Name, GoogleScope.UserInfoEmailScope.Name, GoogleScope.EmailScope.Name }
            });
string state = RandomDataBase64url(32);
string code_verifier = RandomDataBase64url(32);
string code_challenge = Base64urlencodeNoPadding(sha256(code_verifier));
string code_challenge_method = "S256";

string redirectURI = string.Format("http://{0}:{1}/", IPAddress.Loopback, GetRandomUnusedPort());
AuthorizationCodeRequestUrl url = credential.CreateAuthorizationCodeRequest(redirectURI);
url.State = state;
string oauthrequestedURL = url.Build().ToString();
oauthrequestedURL += "&code_challenge=" + code_challenge + "&code_challenge_method=" + code_challenge_method;

// Открывает запрос в браузере.

                System.Diagnostics.Process.Start(oauthrequestedURL);

/ После успешного входа в систему мы можем получить код

var context = httpListener.GetContextAsync().Result;
// Sends an HTTP response to the browser.
var response = context.Response;

// Затем мы анализируем ответ, получаем код успеха, передаем этот код и перенаправляем URI в метод ExchangeCodeForTokenAsyn c.

TokenResponse tokenResponse = credential.ExchangeCodeForTokenAsync("", code, redirectURI, CancellationToken.None).Result;

когда мы вызываем эту строку выше, мы получаем сообщение об ошибке

Error:"invalid_grant", Description:"Missing code verifier.", Uri:"".

Как мы можем передать "grant_type" и "code_verifier" при вызове метода "ExchangeCodeForTokenAsyn c"?

...