Claves API por Usuario no funcionan

Sigo las instrucciones para obtener claves API por usuario: User API keys specification.

He seguido los pasos: el cliente genera un par de claves pública/privada y una URL de retorno, va a una ruta de Discourse, el usuario otorga permiso a Discourse para usar la aplicación y Discourse genera una clave API.

Pero cuando Discourse devuelve la clave API como una “carga útil” (payload) en la URL de retorno, esa clave no funciona. Intento descifrarla, pero no puedo.

Uso esa clave en algún método estándar de descifrado en JavaScript (como en la respuesta aquí) y obtengo un error de “longitud no válida” (o DATA_LEN_NOT_EQUAL_TO_MOD_LEN, dependiendo del método de descifrado en JavaScript que esté usando).

¿Alguna idea sobre cómo abordarlo?

Esta es una funcionalidad crucial, así que cualquier ayuda es muy apreciada.

¿Necesito modificar la clave proporcionada en la carga útil de alguna manera? ¿Es posible que la clave proporcionada en la carga útil no funcione?


Un poco más de detalle:

Creo que mi método general es correcto, porque Discourse ofrece otro método para obtener una clave por usuario y puedo descifrar esa clave:

Si omito la URL de redirección en la solicitud a Discourse, este no realiza una redirección. En su lugar, muestra una clave en la pantalla para que el usuario la copie.

Esa clave es más corta que la proporcionada en una “carga útil” (tiene unos 684 caracteres, mientras que la clave de la carga útil tiene unos 762). Y esa clave funciona: puedo descifrarla sin problemas usando JavaScript.

Pero pedirle al usuario que copie y pegue una clave API resulta confuso; el flujo adecuado es obtener la clave desde la carga útil. ¿Cómo hago para que esa clave de la carga útil funcione?

¿Alguna idea para este caso? ¿Cómo puedo hacer que la clave API proporcionada en el payload funcione?

¡Ya logré que funcione! @RGJ señaló amablemente lo siguiente:

Cuando Discourse realiza la redirección y envía la clave API para que se descifre como una carga útil en la URL de redirección, dicha clave pasa por codificación de URL. Por lo tanto, para obtener la clave API real, debes aplicar la decodificación de URL a la carga útil. El resultado es la clave API que funciona correctamente (la cual coincide con la longitud de la clave que Discourse muestra en pantalla).

He compartido los pasos que sigo para lograr que esto funcione aquí: