У меня есть запущенное приложение, которое делает запланированные настенные сообщения одному из своих друзей от имени пользователя.
Приложение работало отлично в течение довольно долгого времени, но в последнее время тихо, некоторые из пользователей сообщили сообщения, которые не были отправлены.
Журналы показывают
OAuthException: The access token could not be decrypted.
Даже если пользователь пересматривает приложение и сбрасывает токен доступа, это исключение сохраняется.
Каким может быть корень ошибки и способы ее работы?
Если при выполнении 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, с помощью Отклика Token Access .
Знаки Facebook увеличиваются в размере и не ограничиваются 255 символами, поэтому способ их хранения может привести к исключению, если вы используете переменную или поле базы данных с ограниченными размерами.
Это указано в последнем разделе этого документа Facebook: https://developers.facebook.com/docs/facebook-login/access-tokens
Размеры
Ожидайте, что размер всех типов токенов доступа будет меняться со временем, поскольку Facebook вносит изменения в то, что хранится в них и как они закодированы. Вы можете ожидать, что со временем они будут расти и сокращаться. Пожалуйста, используйте тип данных переменной длины без определенного максимального размера для хранения токенов доступа.
Например, чтобы хранить токены в SQL, вы можете избежать использования VARCHAR и вместо этого использовать TEXT или BLOB
Это может быть связано с отделкой токена перед сохранением в базе данных. или размер поля меньше, чем размер чартера токенов. проверьте один раз в таблице {variable} для правильного и полного токена.
В моем случае это было вызвано тем, что accessToken не содержит идентификатор пользователя, когда я сделал запрос «me» (который, я полагаю, пытается определить идентификатор пользователя из токена).
Отклик ответчика:
App ID: <ID> : <app> User ID: Unknown Issued: Unknown Expires: 1339171200 (in about an hour) Valid: True Origin: Web Scopes:
Чтобы исправить проблему, вместо запроса «я», я запросил профиль для идентификатора пользователя, к которому у меня был доступ непосредственно из authResponse.
Эта ошибка часто возникает, когда длина токена доступа неверна. Проверьте формат токена.