Lo he logrado hacer funcionar, tras varios intentos y errores.
Estos son los pasos básicos que sigo cuando tengo una aplicación independiente que he programado y quiero que los usuarios puedan usarla para realizar llamadas a la API de un sitio de Discourse.
Para ello, necesito generar un token de API por usuario para realizar llamadas en nombre de cada usuario específico (al menos en un entorno de Node.js/JavaScript).
Tenga en cuenta que, para la parte de JavaScript, encontré que el código proporcionado por @KengoTODA aquí: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub fue de gran ayuda.
Estos son los pasos que he seguido:
Primero: Generar un par de claves pública y privada.
Esto es algo que su aplicación debe generar: una clave pública y una privada. El gist de GitHub proporciona un método para hacerlo.
Segundo: Tener una URL de redirección.
Esta es la URL a la que Discourse redirigirá, proporcionando el token de API final en la carga útil (payload). Si tiene una aplicación de escritorio (es decir, no tiene una URL de navegador), la URL de redirección se basará en un protocolo personalizado que configure para abrir la aplicación cuando se ingrese la URL de redirección en el navegador.
Tenga en cuenta que la URL de redirección debe estar en la lista blanca en la configuración del sitio del sitio de Discourse de destino.
El sitio de Discourse también probablemente necesite tener activada la configuración del sitio para “Permitir claves de API de usuario”. Consulte la publicación original sobre este tema para obtener detalles sobre “Configuración del sitio”.
Tercero: Enviar la llamada de solicitud de API a la URL de solicitud de Discourse.
Su aplicación enviará una llamada a una URL que sigue este formato:
https://[su sitio de Discourse de destino .com]/user-api-key-new"
y agregando como parámetros:
- el nombre de su aplicación
- su “client_id” (pude usar hostname(), desde
const {hostname} = require('os')para una aplicación de escritorio, al igual que en el gist de GitHub mencionado anteriormente) - ámbitos (scopes) (estos son los ámbitos que desea que el usuario pueda utilizar a través de la API, como “write”, “read”, etc.)
- su clave pública (del paso 1 anterior)
- su URL de redirección (del paso 2 anterior)
- nonce (este es un valor que puede elegir; por ejemplo, usar simplemente ‘1’ parece funcionar)
Cuarto: El usuario autoriza su aplicación en la página del sitio de Discourse que se abre mediante la URL de solicitud
Cuando envíe la URL de solicitud correctamente, se abrirá una página en el sitio de Discourse informando al usuario que su aplicación desea acceder al sitio.
En esa página, hay un botón para que el usuario permita esto. Cuando el usuario hace clic en este botón, el sitio de Discourse redirige a la URL de redirección que proporcionó y adjunta como parámetro un ?payload=[LA CLAVE DE API]. La CLAVE DE API aquí es la clave que necesita decodificar en su aplicación.
Quinto: Su aplicación captura el valor de la URL de redirección (con el valor de carga útil) y decodifica la CLAVE DE API
Casi ha terminado. Su aplicación debe analizar la URL de redirección a la que fue Discourse y obtener la clave de API contenida en la carga útil.
Una vez que tenga esa clave de API, debe hacer dos cosas:
- Obtener la clave real, no la versión codificada en URL: si está obteniendo un parámetro de una URL, a menudo está codificada en URL (agregando % aquí y allá, etc.). Necesita limpiarla. En JavaScript, he encontrado que
decodeURIComponentfunciona para esto. - Una vez que tenga la CLAVE DE API limpiada devuelta por Discourse, debe decodificarla. Para ello, puede usar la decodificación de JavaScript con claves privadas. Básicamente, usa su clave privada (generada en el primer paso anterior) para decodificar la CLAVE DE API limpiada. Hay algún ejemplo de JavaScript en el gist de GitHub que mencioné anteriormente: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
Después de ejecutar su código de decodificación, tiene el token en sí, que ahora puede usar para realizar llamadas de API autenticadas en nombre del usuario.
Sexto: Usar el token (es decir, la clave de API final, limpiada y decodificada) para realizar llamadas a la API en nombre del usuario
Con ese token, parece que no necesita ingresar el nombre de usuario en la llamada a la API. Encuentro que la siguiente cabecera es suficiente cuando la incluye en su llamada GET, POST, PUT, etc.:
headers: {
"User-Api-Key": [el token]
}
Y con eso, espero que tenga un método de autenticación por usuario funcional para interactuar con Discourse.