2014-12-28 2 views
7

Я написал приложение MVC с помощью Google oauth2, как указано здесь: https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web_applicationsСрок действия токена доступа Google OAuth в приложении MVC?

У меня есть проблема с истечением маркер доступа. По истечении срока действия маркера доступа, я получаю исключение при вызове Google API: «Маркер доступа истек, но мы не можем обновить его»

Первоначальная проверка подлинности двух итераций механизм:

первой итерации AuthorizeAsync возвращается результат с пустыми учетными данными и заселена RedirectUri:

Таким образом, гиперссылка авторизации создана такое:

https://accounts.google.com/o/oauth2/auth?access_type=offline&response_type=code&client_id=MYCLIENTID&redirect_uri=http:%2F%2Flocalhost%2FHomepage%2FAuthCallback%2FIndexAsync&scope=https:%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar https:%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&state=http:%2F%2Flocalhost%2FHomepage%2F95419199 

Обратите внимание, что access_type = отсутствует в Presen т. Поэтому я также должен вернуть токен обновления (не получается).

enter image description here

второй итерация - AuthorizeAsync возвращает результат с заполненными и пустым учетными данными RedirectUri:

Question1 - это RefreshToken должен быть пустыми в данный момент?

enter image description here

Результат запоминается, так как он определен как статический.

Следующая запрос, который приходит в - действие календарь, который требует result.Credential вызвать Google Calendar API:

Вопрос2 - если маркер доступа истекает к тому моменту (для тестирования я просто установить ExpiresInSeconds = 0), Я вызываю метод RefreshTokenAsync, но он всегда возвращает false! Зачем? Что мне здесь не хватает?

И каков был бы правильный способ обработки, когда RefreshTokenAsync возвращает false? Текущая команда RedirectResult (result.RedirectUri) завершится с момента получения результата. RedirectUri имеет значение null.

enter image description here

ответ

8

О, я, наконец, получил его :) Для тех, кто заинтересован - обновить маркер выдается только один раз, когда вы получаете этот экран Согласия, где вы должны нажать кнопку Да.

Итак, для того, чтобы получить токен обновления, перейдите в настройки учетной записи, учетная запись Разрешения: https://security.google.com/settings/security/permissions

и отменить доступ для проекта, настроенного в Google Developers Console: https://console.developers.google.com/project

Теперь, поставить точку останова на следующей строке после вызова AuthorizeAsync, перезапустите приложение в режиме отладки, получите экран согласия с разрешениями, нажмите «Принять».

Приложение вернется к VS и остановится в точке останова.

Теперь сделайте запись где-нибудь результат.Значение RefreshToken, это зашифрованная строка.

Я поместил мое приложение для web.config для простоты.

Теперь я просто присваиваю это значение обратно result.Credential.Token.RefreshToken = refreshToken;

и каждый раз, когда токен доступа истекает, он автоматически обновляет его.

enter image description here

Как здесь, когда я называю GmailService request.Execute (...) пропусканием удостоверения объекта, содержащий маркер, маркер будет обновлен.

enter image description here

Смежные вопросы