Подтвердить что ты не робот

OAuth2.0 токен странного поведения (недопустимые учетные данные 401)

Обычно механизм Google OAuth2.0 работает отлично.

  • Пользователь подтверждает разрешение на доступ к аккаунту Google с выбранными областями.
  • Ток обновления обновляется и сохраняется в хранилище в течение длительного времени.
  • Каждый раз, когда это необходимо (если токен доступа истек), токен доступа извлекается и используется для доступа к API.

Но иногда (пока только два раза больше 6 месяцев) я испытал странное поведение:

Запросы API Google возвращают ошибку Неверные учетные данные (401). Обновление токена доступа (с использованием сохраненного токена обновления) не помогает.

Вот какой структурированный вывод я получил при тестировании этой проблемы:

    + ------------------------------------------------------------------------- + 
    | 1.TRYING TO REFRESH THE TOKEN.                                            |
    | 2.DONE REFRESHING THE TOKEN.                                              |
    + ------------------------------------------------------------------------- + 
    |    access:           **************************************************** | 
    |   refresh:                  ********************************************* | 
    |   expires:                                                           3600 | 
    |   created:                                            2013-07-23 13:12:36 | 
    + ------------------------------------------------------------------------- + 

Я также пытался проверить "свежий" токен доступа, отправив запросы на  https://www.googleapis.com/oauth2/v1/tokeninfo

    + ------------------------------------------------------------------------- + 
    | 1. TRYING TO CHECK THE TOKEN .                                            |
    | 2. DONE CHECKING THE TOKEN THE TOKEN.                                     |
    + ------------------------------------------------------------------------- + 
    |       issued_to:                  ************.apps.googleusercontent.com |
    |        audience:                  ************.apps.googleusercontent.com |
    |         user_id:                                             ************ |
    |      expires_in:                                                     3600 |
    |           email:                                     **********@gmail.com |
    |  verified_email:                                                        1 |
    |     access_type:                                                  offline |
    |         scopes::                                                          |
    + ------------------------------------------------------------------------- + 
    | https://www.googleapis.com/auth/userinfo.email                            |
    | https://www.googleapis.com/auth/userinfo.profile                          |
    | https://www.googleapis.com/auth/plus.me                                   |
    | https://www.googleapis.com/auth/drive                                     |
    + ------------------------------------------------------------------------- + 

Но когда я пытаюсь получить доступ к корму для диска, ответ будет следующим:

    Error calling GET https://www.googleapis.com/drive/v2/files (401) Invalid Credentials

    domain:         global
    reason:         authError
    message:        Invalid Credentials
    locationType:   header
    location:       Authorization

Мы также столкнулись с той же проблемой с календарями. Итак:

  • Токен был действителен до (все работало).
  • Обновление токена все еще работает.
  • Запрос фида отвечает ошибкой "Недействительные учетные данные".
  • Все остальные токены все еще работают отлично, что означает, что код действителен.

Обычно, когда токен отменяется, при попытке обновить токен возвращается ошибка "invalid_grant".

Вопросы

  • В чем причина такого поведения? Если токен обновления был отозван или был недействителен каким-либо другим способом, должен ли запрос на новый токен доступа произвести ошибку?
  • Есть ли способ проверить токен обновления?
4b9b3361

Ответ 1

В документах API Google по ошибкам и кодам ошибок:

https://developers.google.com/drive/handle-errors#401_invalid_credentials

401: Invalid Credentials

Invalid authorization header. The access token you're using is either expired or invalid.

error: {
  errors: [
   {
  "domain": "global",
  "reason": "authError",
  "message": "Invalid Credentials",
  "locationType": "header",
  "location": "Authorization",
  }
  ],
  "code": 401,
  "message": "Invalid Credentials"
  }
}

Это точно соответствует вашей версии ошибки, поэтому очень вероятно, что Google считает неправильным ваш запрос.

Но, как вы хорошо знаете, запросы API Google могут возвращать ошибки, которые явно бесполезны для фактической диагностики проблемы. Я получил ошибки "Недопустимые учетные данные" по ряду причин. Это почти всегда на самом деле, потому что я сделал какое-то изменение, которое, как я думал, не имеет значения, но на самом деле.

Моя первая мысль (снятая в темноте здесь) заключалась в том, чтобы перейти на консоль Google API:

https://code.google.com/apis/console

Аутентификатор аутентификации googles auth (https://www.googleapis.com/oauth2/v1/tokeninfo) может возвращать действительный ответ, но, возможно, клиентский секрет или идентификатор клиента будут изменены.

Даже незначительные изменения в теле ответа могут также вызвать эту ошибку.

Я не знаю, как вы делаете запросы, будь то вызовы REST или клиентская библиотека, но я использую ruby ​​lib, который позволяет интерфейсу командной строки создавать вызовы API. Я нашел это, и игровая площадка OAuth2 очень полезна для диагностики вызовов API Google.

Просто FYI: я получил 2 ошибки от API Google: "Недопустимые учетные данные" и "Недостаточные разрешения". Последний почти всегда имел дело с плохими областями. Первый - это все остальное.

Я бы также сказал, что если у вас только 2 ошибки за 6 месяцев, вам повезло!

Ответ 2

У меня возникла эта проблема, когда я попытался поэкспериментировать с изменением URL-адреса перенаправления на консоли Google, а затем обновил файл учетных данных json на сервере. Я должен был очистить переменные сеанса перед запуском заново. Так что в вашем проекте просто сделайте это один раз:

session_start(); //starts a session
session_unset(); //flushes out all the contents previously set

Не забудьте удалить session_unset() после сухой работы один раз.

Ответ 3

Я нахожусь в среде разработки. У меня тоже была эта проблема.

Сначала я попробовал обновить учетные данные. Безрезультатно. Затем я удалил свое приложение (поскольку я все еще занимаюсь разработкой, это было нормально, но БУДЬТЕ ОСТОРОЖНЫ С ЭТОМ ДЕЙСТВИЕМ, если вы уже используете это на производстве), создал новый, обновил учетные данные JSON на клиенте. все равно, никакого результата.

Я решил это, открыв новый экземпляр браузера, который не был зарегистрирован в моей учетной записи Google (частный просмотр, так как я нахожусь в Firefox), снова зарегистрировался в моей учетной записи Google и попытался использовать моего клиента (который веб-приложение). Я был перенаправлен на экран авторизации, как ожидалось, и после этого он работал отлично для меня.

Ответ 4

Недавно я испытал эту странную ошибку. Мое исправление: я помещаю функцию, которая отключает все сеансы перед перенаправлением на AuthUrl.

Ответ 5

Возможно, это связано с ограничением, которое Google описывает следующим образом:

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

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

Ответ 6

Очистка хранилища в Google Chrome у меня сработала (не знаю всех подробностей о том, что очищает "Очистить хранилище"):

  1. F12 (Ctrl+Shift+I)
  2. Вкладка Application
  3. Clear storage

Ответ 7

У меня была такая же проблема с этой ошибкой:

The redirect URI in the request, does not match the ones authorized for the OAuth client.

Но нашел это очень простое решение с помощью abhishek77 здесь:

https://coderwall.com/p/fmr5ag/avoid-invalid-credentials-with-google-oauth2

Решение:

Если вы используете https://github.com/zquestz/omniauth-google-oauth2, обязательно следуйте примечанию в README. " Вы должны включить" Контакты API "и" Google+ API "через консоль API Google. "

Включение их в консоли API Google устранило для меня проблему "Неверные учетные данные".

Ответ 8

Я получил (401) Invalid Credentials, когда я удалил доступ к моей учетной записи Google для конкретного приложения. Так что мне нужно было снова запросить URL авторизации (тот, который начинается с https://accounts.google.com/o/oauth2/auth).

Ответ 9

Я столкнулся с этой проблемой, когда мне нужно было изменить область видимости только для чтения, чтобы читать и писать все файлы. Итак, я обновил свои области в верхней части моего файла с помощью "Только для чтения", чтобы:

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/drive'];

Google, из своего руководства по API, имеет эти комментарии, которые говорят, что всякий раз, когда вы меняете области действия, вы должны обновлять учетные данные. Я считаю, что это означает, хотя я не уверен, что токен должен быть обновлен. Старый токен по-прежнему принадлежит Google, и он думал, что у меня только доступ только для чтения, поэтому он должен вернуть ошибку 401. Итак, мне нужно переделать свой токен, но Google никогда не предлагал новый экран согласия, который позволил бы мне разрешить чтение и запись во все файлы. Итак, мне нужно было снова открыть этот экран, чтобы он создавал новый токен для замены старого:

fs.readFile(TOKEN_PATH, function(err, token) {
    if (err) {
      getNewToken(oauth2Client, callback);
    } else {
        getNewToken(oauth2Client, callback);
    //   oauth2Client.credentials = JSON.parse(token);
    //   callback(oauth2Client);
    }
  });

Поскольку у меня уже был сохраненный токен, он никогда не создавал новый. Итак, я просто прокомментировал использование старого токена и сказал ему получить новый токен, независимо от того, есть он или нет. Затем я перешел в мои подключенные приложения в Google и удалил мои старые учетные данные. Я не уверен, нужен ли этот шаг, но я только пытаюсь получить доступ к своей личной учетной записи. Затем, когда я запускал свою программу, мне было предложено повторно аутентифицироваться, и все работало, и я не получил ошибку проверки подлинности. После этого обязательно удалите прокомментированные строки для использования уже сделанных маркеров. Я использовал файл quickstart.js API Google для всего этого.

Итак, когда я обновлял свои области, старый токен все еще использовал область Read Only, поэтому я бы получил (401) Invalid Credentials.

Ответ 10

Я решил эту проблему, когда удалил файлы json в c:\Users\[user] \. credentials.

Ответ 11

userInfo: Invalid Credentials Я получил следующую ошибку, потому что элементы массива областей действия, к которым я пытался получить доступ, например, профиль и электронная почта, ссылки на которые я получил со страницы области действия google+ api: оказались как-то ложными/недействительными, поэтому я перешел на экран своего согласия и там под Scopes for Google API было упомянуто профиль электронной почты openID при наведении на каждый полученный мной соответствующий URL, заменяя мои старые на эти, исправил мою ошибку