Как разрешить «Срок действия токена доступа истек, но мы не можем его обновить» в 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();

}

person Prince Jea    schedule 18.07.2016    source источник


Ответы (1)


Предполагая, что у вас уже есть токен обновления, вы включаете токен обновления при создании TokenResponse

var token = new TokenResponse { 
    AccessToken = access_token, 
    RefreshToken = refresh_token
};

Учетные данные пользователя

UserCredential — это потокобезопасный вспомогательный класс для использования токена доступа для доступа к защищенным ресурсам. Срок действия токена доступа обычно истекает через 1 час, после чего вы получите сообщение об ошибке, если попытаетесь его использовать.

UserCredential и AuthorizationCodeFlow заботятся об автоматическом «обновлении» токена, что просто означает получение нового токена доступа. Это делается с помощью долгоживущего токена обновления, который вы получаете вместе с токеном доступа, если используете параметр access_type=offline во время потока кода авторизации.

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

person Nkosi    schedule 18.07.2016