Estoy intentando obtener información sobre un grupo de forma programática a través de la API de Discourse. Tengo el código para esto en mi panel de personalización, dentro de la etiqueta < /head>. Soy administrador de mi foro.
No está funcionando y creo que puede ser porque no entiendo cómo funcionan las claves de API.
Si quiero que Discourse haga una llamada a la API para obtener información sobre un grupo cada vez que cualquier usuario visite una página determinada, ¿cuál es la configuración correcta de la clave de API?
Esto es lo que tengo hasta ahora:
En mi panel de control, he ido a API → Nueva clave de API. Allí, necesito seleccionar “Nivel de usuario”. Disculpa la pregunta básica, pero ¿qué significa “Nivel de usuario” aquí? (la llamada a la API debe ejecutarse cada vez que cualquier usuario vaya a la página dada).
He seleccionado “Todos los usuarios”. Luego genero el token.
Después, en mi panel de personalización de CSS/HTML dentro de < /head>, he ingresado lo siguiente entre las etiquetas <script> correspondientes:
var groupName = [NOMBRE DEL GRUPO RELEVANTE]
var token = [TOKEN QUE GENERÉ]
$.ajax({
url: 'https://myforum.com/groups/groupName.json',
contentType: "application/json",
headers: {
"Api-Key": token,
"Api-Username": "system"
},
dataType: 'json',
success: function(result){
console.log('result = ' + result);
}
})
El código se ejecuta, pero devuelve un error indicando que no está autorizado (aunque soy administrador y miembro del grupo que estoy usando para experimentar).
¿No va esto a exponer tu clave de API de Todos los Usuarios a cualquiera que pueda ver tu sitio? Creo que tendrás que buscar otro enfoque para obtener los datos del grupo desde un componente de tema.
Si la información del grupo que necesitas no está disponible en la carga JSON del usuario, debes determinar cómo agregarla al serializador. Buscar “agregar al serializador” o quizás addToSerializer o add_to_serializer en componentes de temas y plugins existentes podría ayudarte.
¿Pero no debería funcionar el código en cualquier caso? La API ofrece la posibilidad de obtener información sobre un grupo. Sigo confundido sobre cómo se supone que debe funcionar, supongo.
¿Cuál sería la forma normal de usar la API para obtener información sobre un grupo específico?
La pieza clave de información que necesito es saber si el usuario es propietario del grupo o no. Esta información es devuelta por la API JSON. Así que cuando un usuario va a una página determinada, quiero hacer una llamada a la API para obtener información sobre un grupo, que en la respuesta básica incluye si el usuario conectado en el cliente es propietario.
Esto parece una implementación directa de la API. Sin embargo, parece que esta operación requiere una clave de API, pero el método que he utilizado hasta ahora no funciona.
No creo que sea necesario crear un complemento o un componente de tema separado, ya que esta operación es una de las básicas que proporciona la API JSON.
Me pregunto si existe una forma de usar la API con una clave que no exponga la clave (es decir, cuál sería la forma estándar o de mejores prácticas para usar la API).
EDITO: Si por alguna razón esto no es apropiado para la llamada a la API, entonces sí tendría que ser serializado. ¿Alguien tiene código funcional para eso? Entiendo que existe un método add_to_serializer, pero no he logrado que la sintaxis funcione correctamente y he tenido dificultades para encontrar ejemplos funcionales del método.
Sí, hice una verificación rápida para ti (como referencia) e inicié sesión en un foro de prueba como miembro del personal y obtuve el grupo staff, obteniendo los resultados esperados:
Objeto JSON para el grupo staff por un miembro del personal
@neounix: Muchas gracias por tu respuesta. Me ahorraste una búsqueda infructuosa. Pensaba que la razón por la que recibía una respuesta no autorizada era un problema de autenticación.
Resulta que tienes razón: no se requiere ninguna clave de API para esta acción. Más bien, fue un error de código (simple), algo que queda claro en el código que publiqué arriba, pero que había pasado por alto antes (estaba introduciendo incorrectamente la variable para la URL de AJAX).
Aquí está el código que funciona:
var groupName = [NOMBRE DEL GRUPO RELEVANTE]
var token = [TOKEN QUE GENERÉ]
$.ajax({
url: 'https://myforum.com/groups/' + groupName + '.json', //aquí estaba el error anterior
contentType: "application/json",
dataType: 'json',
success: function(result){
console.log('respuesta completa = ' + JSON.stringify(result));
console.log('es propietario del grupo = ' + result.group.is_group_owner); //nota: esto será true o null
}
})
Antes recibía la respuesta no autorizada porque la URL anterior que estaba usando tenía el nombre de grupo incorrecto (se estaba leyendo como “groupName”).