Как решить "Маркер доступа истек, но мы не можем его обновить" в MVC
В настоящее время я работаю над Google Api, целью которого является получение круга зарегистрированного пользователя. У меня уже есть токен доступа, но проблема заключается в том, что всякий раз, когда я пытаюсь запустить свой код, он возвращает это исключение
Срок действия токена истек, но мы не можем его обновить
Как мне решить эту проблему?
var claimsforUser = await UserManager.GetClaimsAsync(User.Identity.GetUserId());
var access_token = claimsforUser.FirstOrDefault(x => x.Type == "urn:google:accesstoken").Value;
string[] scopes = new string[] {PlusService.Scope.PlusLogin,
PlusService.Scope.UserinfoEmail,
PlusService.Scope.UserinfoProfile};
var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "xx-xx.apps.googleusercontent.com",
ClientSecret = "v-xx",
},
Scopes = scopes,
DataStore = new FileDataStore("Store"),
});
var token = new TokenResponse { AccessToken = access_token, ExpiresInSeconds=50000};
var credential = new UserCredential(flow, Environment.UserName, token);
PlusService service = new PlusService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "ArcaneChatV2",
});
PeopleResource.ListRequest listPeople = service.People.List("me", PeopleResource.ListRequest.CollectionEnum.Visible);
listPeople.MaxResults = 10;
PeopleFeed peopleFeed = listPeople.Execute();
var people = new List<Person>();
while (peopleFeed.Items != null)
{
foreach (Person item in peopleFeed.Items)
{
people.Add(item);
}
if (peopleFeed.NextPageToken == null)
{
break;
}
listPeople.PageToken = peopleFeed.NextPageToken;
// Execute and process the next page request
peopleFeed = listPeople.Execute();
}
1 ответ
Предполагая, что у вас уже есть токен обновления, вы включаете токен обновления при создании TokenResponse
var token = new TokenResponse {
AccessToken = access_token,
RefreshToken = refresh_token
};
UserCredential - это потокобезопасный вспомогательный класс для использования токена доступа для доступа к защищенным ресурсам. Маркер доступа обычно истекает через 1 час, после чего вы получите сообщение об ошибке, если попытаетесь его использовать.
UserCredential и AuthorizationCodeFlow заботятся об автоматическом "обновлении" токена, что просто означает получение нового токена доступа. Это делается с помощью долгоживущего токена обновления, который вы получаете вместе с токеном доступа, если вы используете параметр access_type = offline во время потока кода авторизации.
В большинстве приложений рекомендуется хранить токен доступа и обновлять токен в постоянном хранилище. В противном случае вам потребуется каждый час предоставлять браузеру страницу авторизации в браузере, поскольку срок действия маркера доступа истекает через час после его получения.