Discourse contiene un sistema para generar claves de API por usuario si se sigue un protocolo muy específico. Esta característica facilita el acceso de “aplicaciones” a las instancias de Discourse sin necesidad de involucrar a los moderadores.
Descripción general
A grandes rasgos:
- El cliente (aplicación de escritorio, complemento de navegador, aplicación móvil) genera un par de claves pública/privada y una URL de retorno
- El cliente redirige a una ruta en Discourse proporcionándole su clave pública a Discourse
- Discourse obtiene la aprobación del usuario para usar la aplicación
- Discourse genera una clave de API de usuario
- Discourse redirige de vuelta a la URL de retorno con una carga útil cifrada usando la clave pública que contiene la clave de API del usuario
Detalles
Casos de uso:
-
Aplicaciones de escritorio que consultan sitios de Discourse en nombre de los usuarios finales para obtener recuentos de notificaciones en múltiples sitios.
-
Aplicaciones móviles que consultan sitios de Discourse en nombre de los usuarios finales y gestionan notificaciones push.
-
Aplicaciones web que proporcionan un panel de control para los usuarios finales sobre varios sitios de Discourse.
-
Integraciones personalizadas con aplicaciones de terceros que consumen Discourse como parte de una aplicación corporativa general. Por ejemplo: integrar notificaciones de la comunidad de Discourse en la aplicación hopscotch.
El diseño:
Ajustes del sitio
-
allow_user_api_key_scopes: ámbitos de acceso permitidos para las claves de API de usuario. Los ámbitos se definen aquí. Los ámbitos integrados disponibles son:
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(los complementos pueden registrar ámbitos adicionales). -
user_api_key_allowed_groups: controla qué grupos están autorizados a generar claves de API de usuario (por defecto: administradores, moderadores y trust_level_0)
-
allowed_user_api_push_urls: lista de sitios que pueden ser destinos para notificaciones push
-
allowed_user_api_auth_redirects: destinos de redirección permitidos después de la generación de la clave de API de usuario
Ajustes globales
- max_user_api_reqs_per_minute: 20
- max_user_api_reqs_per_day: 2880
Elementos de la experiencia de usuario (UX)
Si se han concedido claves de API de usuario, Discourse muestra una pestaña aplicaciones en la página del usuario.
La pestaña aplicaciones listará:
- El nombre de la aplicación, por ejemplo: (“Discourse Notifier”)
- Fecha del último uso
- Fecha de aprobación
- Lista de ámbitos de acceso concedidos
- Un botón revocar acceso para que puedas revocar fácilmente cualquier clave
Interfaz de usuario de autorización de clave de API
Cada clave tendrá que ser autorizada explícitamente por los usuarios finales en una página que explique claramente lo que está sucediendo, por ejemplo:
“Discourse Notifier” está solicitando el siguiente acceso a su cuenta:
- Leer y borrar notificaciones
- Leer información de sesión del usuario
- Crear un token de inicio de sesión único
[Autorizar]
Flujo de generación de clave de API
La API solo requiere una única solicitud GET por parte del usuario.
https://nombredelsitio.com/user-api-key/new
A partir de Discourse 2.1, estas claves de API de usuario caducan automáticamente si no se utilizan durante largos períodos de tiempo. El ajuste del sitio:
revoke user api keys unused daysse establece en 180 por defecto.
Parámetros:
- auth_redirect: URL a la que redirigir con el token generado
- application_name: el nombre de la aplicación que realiza la solicitud (se mostrará en la pestaña Aplicaciones de la cuenta del usuario)
- client_id: un identificador único para el cliente
- nonce: un nonce único generado por el cliente. Se repetirá en la carga útil cifrada para que el cliente pueda verificar la autenticidad de la respuesta
- scopes: lista separada por comas de los ámbitos de acceso permitidos para la clave, consulta
allow user api key scopespara obtener la lista completa de ámbitos disponibles - push_url: URL a la que enviar notificaciones push (requerido y válido solo si
pushonotificationsestán incluidos en los ámbitos) - public_key: la parte pública del par de claves generado por el cliente
- padding (opcional): el modo de relleno RSA a utilizar para cifrar la carga útil. Los valores aceptados son
pkcs1(por defecto) uoaep. Se recomienda OAEP para nuevas aplicaciones.
Después de llamar a /user-api-key/new con los parámetros correctos, pueden ocurrir 2 cosas:
- Si el usuario no ha iniciado sesión, se le redirigirá al inicio de sesión (después de iniciar sesión, reanudaremos la autorización)
- Una vez que un usuario haya iniciado sesión, se le presentará la interfaz de usuario de autorización.
Después de que se permita la autorización, el sistema redirigirá a la URL definida en auth_redirect e incluirá un parámetro payload cifrado que contiene un objeto JSON con la clave de API de usuario generada (key), el nonce, el estado push (push) y la versión de la API (api). Si se solicitó el ámbito one_time_password, también se incluirá un parámetro de consulta oneTimePassword cifrado por separado. client_id no se devuelve para mayor seguridad.
Comprobación de la versión de la API
La clave de API de uso en Discourse está versionada. Los clientes pueden comprobar la versión de la API de un sitio de Discourse realizando una solicitud HEAD a https://nombredelsitio.com/user-api-key/new. La respuesta contendrá una cabecera llamada Auth-Api-Version que muestra el número de versión de la API del sitio.
Consumo de la API
El consumo de la API del cliente será algo diferente al de la API de administración actual.
El cliente puede especificar 2 cabeceras:
User-Api-Key (obligatoria): la clave que se generó
y
User-Api-Client-Id (opcional): proporciónala para actualizar el ‘identificador de cliente’ almacenado para esta api_key en la base de datos.
Una vez especificadas estas cabeceras, el cliente puede realizar solicitudes a la API como lo haría normalmente.
Generación de una contraseña de un solo uso
A partir de la versión 4, la API incluye un ámbito especial: el ámbito one_time_password, que permite a los clientes usar la clave de API de usuario para generar una contraseña de un solo uso. Si el cliente incluye este ámbito al generar la clave de API siguiendo los pasos anteriores, se incluirá una oneTimePassword cifrada como un parámetro de consulta separado en la redirección de vuelta al cliente.
Alternativamente, el cliente puede realizar una solicitud GET a /user-api-key/otp con los siguientes parámetros:
- auth_redirect
- application_name
- public_key
- padding (opcional)
y con la cabecera User-Api-Key.
Esta solicitud redirigirá a una pantalla en Discourse que le pedirá al usuario que autorice a la aplicación el acceso al sitio. Si el usuario aprueba, el sitio redirigirá de vuelta a la URL definida en auth_redirect e incluirá un parámetro oneTimePassword cifrado con una contraseña de un solo uso que el cliente puede utilizar para iniciar sesión en el sitio solicitando https://nombredelsitio.com/session/otp/PASSWORD-DE-UN-SOLO-USO. (La contraseña de un solo uso solo es válida durante 10 minutos).
Revocación de claves de API
Para revocar una clave de API, realiza una solicitud POST con la cabecera User-Api-Key y sin parámetros a /user-api-key/revoke.
Última revisión por @SaraDev el 2022-07-13T00:00:00Z

