Запрос имеет неверные учетные данные для аутентификации.Ожидаемый токен доступа OAuth 2, файл cookie для входа или другие действительные учетные данные для аутентификации - PullRequest
1 голос
/ 01 июля 2019

У меня есть консольное приложение, написанное с C# поверх платформы .NET Core 2.2.

Я пытаюсь использовать свое приложение для подключения Google My Business API для создания записей .

Но каждый раз, когда я пытаюсь вызвать REST API, я получаю следующую ошибку

Запрос имеет недопустимые учетные данные для аутентификации.Ожидаемый токен доступа OAuth 2, файл cookie для входа или другие действительные учетные данные для аутентификации.См. https://developers.google.com/identity/sign-in/web/devconsole-project.

Код работал ранее, но по какой-то странной причине он остановился!

Вот пример, где я получаю токен аутентификации, а затем вызываю API для получения спискаиз учетных записей Google .

var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
{
    ClientId = "Client ID",
    ClientSecret = "Client Secret",
}, new[] { "https://www.googleapis.com/auth/plus.business.manage" }, "google username", CancellationToken.None);

using (var client = new HttpClient())
{   
    //client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", credential.Token.AccessToken);
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var c = await client.GetAsync("https://mybusiness.googleapis.com/v4/accounts");
    var accountContentss = await c.Content.ReadAsStringAsync();
    c.EnsureSuccessStatusCode();
    var accountContent = await c.Content.ReadAsStringAsync();
}

Я могу без проблем пройти проверку подлинности и получить маркер доступа.Однако второй вызов API по какой-то причине завершается неудачей.

Как правильно вызвать Google API?Помимо AccesToken, есть ли что-то еще, что должно быть передано в заголовке?

1 Ответ

3 голосов
/ 01 июля 2019

Оказалось, что GoogleWebAuthorizationBroker.AuthorizeAsync() возвращал просроченный токен!Было бы очень полезно, если бы API возвратил сообщение о том, что срок действия токена истек!

Чтобы исправить проблему, вместо того, чтобы обращаться к AccessToken вручную (т. Е. credential.Token.AccessToken), я использовал await Credential.GetAccessTokenForRequestAsync() способ получения токена доступа.

Метод Credential.GetAccessTokenForRequestAsync() возвращает действительный токен при каждом вызове.Другими словами, если срок действия токена истек, он использует токен обновления для генерации нового.В противном случае он возвращает существующий токен с истекшим сроком действия.

Я изменяю свой заголовок авторизации на этот

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await Credential.GetAccessTokenForRequestAsync());
...