Клиент на Google API: Токенът е отменен проблем

Използвам google-api-client gem в моя Rails проект. Имам работещи omniauth и devise и имам удостоверяване на потребителите чрез Google.

Мислех, че всичко върви много добре доскоро. Забелязах, че приложението ми ще изведе грешка, когато извлече API на Google Calendar след един час. Изтичането е един час от времето за удостоверяване и оттогава получавам тази грешка:

Signet::AuthorizationError (Authorization failed.  Server message:
{
   "error" : "invalid_grant",
   "error_description" : "Token has been revoked."
}):

Това е отделно от невалидните токени за опресняване, тъй като аз имам токена за опресняване, съхранен в базата данни. Той изпраща заявката за токен за опресняване, която предизвиква тази грешка по-горе, с този код:

client = Google::APIClient.new(
  :application_name => APP_NAME,
  :application_version => APP_VERSION,
)

client.authorization.client_id = CLIENT_ID
client.authorization.client_secret = CLIENT_SECRET

client.authorization.refresh_token = user.auth_refresh_token
token_result = client.authorization.fetch_access_token!

Бях много внимателен, за да не влизам и излизам от акаунтите си в Google, така че не мога да разбера защо Google ще изпрати обратно това съобщение. Ако опресня страницата след 55 минути, всичко е наред. Ако опресня страницата след 1 час, тя се оплаква, че маркерът за достъп е отменен.

Някой имал ли е този проблем преди? Ако е така, какво направихте, за да го поправите? Беше ли нещо, което трябваше да промените в конзолата за разработчици на Google?


person JakeLarson    schedule 09.09.2015    source източник
comment
Разрешавали ли сте някога това? Един вид има същия проблем.   -  person meder omuraliev    schedule 12.01.2016
comment
@mederomuraliev Добавих отговор от това, което можах да си спомня, когато поправих това. Надявам се да е полезно.   -  person JakeLarson    schedule 13.01.2016


Отговори (1)


В крайна сметка разбрах проблема, така че реших да споделя какво го поправи.

В config/initializers/devise.rb имам:

scope: 'userinfo.profile, userinfo.email, calendar, https://www.googleapis.com/auth/gmail.readonly', prompt: 'select_account consent' }

Това, което го направи за мен, беше частта prompt: 'select_account consent'. Искането на потребителя за съгласие при всяко влизане изглежда поддържа маркера за опресняване актуален. Когато потребителят влезе през Google, проверявам дали има означение за опресняване в отговора и ако има, го запазвам в базата данни. Ако не, запазвам текущия им маркер за опресняване в базата данни.

Честно казано, наистина не разбирам защо беше необходимо да правя това, но за други потребители, които са споделили своите примери за код, беше добре. Може би е имало промяна в OAuth2 на Google или може би има несъответствие в моя метод за обработка на разрешението.

person JakeLarson    schedule 13.01.2016
comment
страхотно Благодаря Ви за отговора. Успях да разреша моята и всъщност трябваше да генерирам повторно токена, защото паролата беше променена и беше отменена. Само в случай, че някой друг се натъкне на това. - person meder omuraliev; 14.01.2016