Facebook OAuthException: токен доступа не может быть расшифрован

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

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

В журналах отображается

OAuthException: The access token could not be decrypted. 

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

Каким может быть корень ошибки и способы ее работы?

Ответ 1

Если при выполнении HTTP-запросов к API Facebook появляется следующее сообщение об ошибке:

{
  "error": {
       "message": "The access token could not be decrypted",
       "type": "OAuthException",
       "code": 190
  }
}

это означает, что токен доступа, который вы отправляете в Facebook, когда вы делаете HTTP-запрос НЕдействителен.

Если вы посмотрите на заголовки заголовков HTTP, вы увидите такое поле:

WWW-Authenticate:OAuth "Facebook Platform" "invalid_token" "The access token could not be decrypted"

Я получил ошибку выше, потому что я отправлял токен доступа, который был на 1 символ короче, чем тот, который был действительным.
После сравнения токена доступа с тем, который я отправлял, я обнаружил эту ошибку.

Вы можете проверить достоверность токена доступа OAuth 2.0 (токена-носителя), используемого на Facebook, с помощью Отклик тонера доступа.

Ответ 2

Знаки Facebook увеличиваются в размере и не ограничиваются 255 символами, поэтому способ их хранения может привести к исключению, если вы используете переменную или поле базы данных с ограниченными размерами.

Это указано в последнем разделе этого документа Facebook: https://developers.facebook.com/docs/facebook-login/access-tokens

Размеры

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

Например, чтобы хранить токены в SQL, вы можете избежать использования VARCHAR и вместо этого использовать TEXT или BLOB

Ответ 3

Это может быть связано с отделкой токена перед сохранением в базе данных. или размер поля меньше, чем размер чартера токенов. проверьте один раз в таблице {variable} для правильного и полного токена.

Ответ 4

В моем случае это было вызвано тем, что accessToken не содержит идентификатор пользователя, когда я сделал запрос на "я" (который, я полагаю, пытается определить идентификатор пользователя из токена).

Отклика маркера:

App ID: 
<ID> :   <app>
User ID: Unknown
Issued:  Unknown
Expires: 1339171200 (in about an hour)
Valid:   True
Origin:  Web
Scopes: 

Чтобы исправить проблему, вместо запроса "я", я запросил профиль для идентификатора пользователя, к которому у меня был доступ непосредственно из authResponse.

Ответ 5

Эта ошибка часто возникает, когда длина токена доступа неверна. Проверьте формат токена.