Я пытаюсь внедрить 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"?