Facebook OAuthException: el token de acceso no se pudo descifrar

Tengo una aplicación en ejecución que hace publicaciones de pared progtwigdas a uno de sus amigos en nombre del usuario.

La aplicación funcionaba bien desde hace bastante tiempo, pero recientemente algunos usuarios han informado que los mensajes no se publicaron.

Los registros muestran

OAuthException: The access token could not be decrypted. 

Incluso si el usuario vuelve a visitar la aplicación y restablece su token de acceso, la excepción persiste.

¿Cuál puede ser la raíz del error y las formas de evitarlo?

Si aparece el siguiente mensaje de error al realizar solicitudes HTTP a la API de Facebook:

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

significa que el token de acceso que está enviando a Facebook cuando realiza la solicitud HTTP NO es válido.

Si miras los encabezados de respuesta HTTP , verás un campo como este:

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

Recibí el error anterior porque estaba enviando un token de acceso que era 1 carácter más corto que el válido.
Después de comparar el token de acceso persistido con el que estaba enviando, descubrí este error.

Puede verificar la validez del token de acceso OAuth 2.0 (token de portador) utilizado en Facebook con Access Token Debugger .

Los tokens de Facebook están aumentando de tamaño y no tienen más limitaciones que 255 caracteres, por lo que la forma en que los almacene puede dar como resultado una excepción si utiliza una variable o un campo de base de datos con tamaños limitados.

Esto se especifica en la última sección de este documento de Facebook: https://developers.facebook.com/docs/facebook-login/access-tokens

Tamaños

Espere que el tamaño de todos los tipos de tokens de acceso cambie con el tiempo a medida que Facebook realiza cambios en lo que está almacenado en ellos y cómo están codificados. Puedes esperar que crezcan y se encojan con el tiempo. Utilice un tipo de datos de longitud variable sin un tamaño máximo específico para almacenar tokens de acceso.

Por ejemplo, para almacenar tokens en un SQL, puede evitar el uso de VARCHAR y usar TEXT o BLOB en su lugar

Esto puede porque token trim antes de guardar en la base de datos. o el tamaño del campo es menor que el tamaño de carta simbólica. verifique una vez en la tabla {variable} para el token correcto y completo.

En mi caso esto fue causado por el accessToken que no contiene el ID de usuario cuando realicé una solicitud para “mí” (que, supongo, intenta determinar el ID de usuario del token).

Respuesta del depurador de tokens:

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

Para solucionar el problema, en lugar de solicitar ‘me’, solicité el perfil para el ID de usuario, al cual tuve acceso directamente desde authResponse.

Este error suele ocurrir cuando la longitud del token de acceso no es correcta. Verifica el formato del token.