Estou tentando obter programaticamente informações sobre um grupo usando a API do Discourse. Tenho o código para isso no meu painel de personalização, dentro da tag . Sou administrador do meu fórum.
Não está funcionando, e acho que pode ser porque não entendo como as chaves de API funcionam.
Se eu quiser que o Discourse faça uma chamada à API para obter informações sobre um grupo toda vez que qualquer usuário visitar uma determinada página, qual é a configuração correta da chave de API?
É isso que tenho até agora:
No meu painel, fui em API → Nova Chave de API. Lá, preciso selecionar “Nível de Usuário”. Desculpe pela pergunta básica, mas o que significa “Nível de Usuário” aqui? (a chamada à API precisa ser executada sempre que qualquer usuário acessar a página em questão).
Selecionei “Todos os Usuários”. Em seguida, gerei o token.
Depois, no meu painel de personalização de CSS/HTML, dentro da tag , inseri o seguinte entre as tags <script> relevantes:
var groupName = [NOME DO GRUPO RELEVANTE]
var token = [TOKEN QUE GEREI]
$.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);
}
})
O código é executado, mas retorna um erro dizendo que não há autorização (mesmo eu sendo administrador e membro do grupo que estou usando para testar).
Isso não vai expor sua Chave de API de Todos os Usuários para todos que podem visualizar seu site? Acredito que você precisará encontrar outra abordagem para obter os dados do grupo a partir de um componente de tema.
Se as informações do grupo que você precisa não estiverem no JSON carregado disponível para o usuário, você precisará descobrir como adicioná-las ao serializador. Procurar por “add to serializer” ou talvez addToSerializer ou add_to_serializer em componentes de tema e plugins existentes pode ajudar.
Mas o código não deveria funcionar em qualquer caso? A API oferece a capacidade de obter informações sobre um grupo. Ainda estou confuso sobre como isso é supposed to funcionar, acho.
Qual seria a maneira normal de usar a API para obter informações sobre um grupo específico?
A informação principal que eu quero saber é se o usuário é ou não o proprietário do grupo. Essa informação é retornada pela API JSON. Então, quando um usuário acessa uma página específica, quero fazer uma chamada à API para obter informações sobre o grupo, que na resposta básica inclui se o usuário logado no cliente é o proprietário.
Isso parece uma implementação direta da API. No entanto, parece que essa operação requer uma chave de API, mas o método que tenho usado até agora não está funcionando.
Não acho que seja necessário criar um plug-in ou componente de tema separado aqui, já que essa operação é uma das básicas fornecidas pela API JSON.
Estou curioso se há uma maneira de usar a API com uma chave que não exponha a chave (ou seja, qual seria a maneira padrão/melhor prática de usar a API).
EDIT: Se, por algum motivo, isso não for apropriado para a chamada da API, então sim, teria que ser serializado. Alguém tem código funcional para isso? Entendo que existe um método add_to_serializer, mas não consegui fazer a sintaxe funcionar corretamente e tenho tido dificuldade em encontrar exemplos funcionais do método.
Sim, fiz uma verificação rápida para você (como referência), entrei em um fórum de teste como membro da equipe e consultei o grupo staff, obtendo os resultados esperados:
Objeto JSON para o grupo staff por membro da equipe
@neounix: Muito obrigado pela sua resposta. Isso encerrou minha busca infrutífera. Eu achava que a razão pela qual estava recebendo a resposta “não autorizado” era devido a um problema de autenticação.
Acontece que você está certo: não é necessária nenhuma chave de API para essa ação. Na verdade, foi um erro de código (simples), o que fica claro no código que postei acima, mas que eu havia passado despercebido antes (eu estava inserindo incorretamente a variável para a URL do AJAX).
Aqui está o código funcionando:
var groupName = [NOME DO GRUPO RELEVANTE]
var token = [TOKEN QUE GEREI]
$.ajax({
url: 'https://myforum.com/groups/' + groupName + '.json', //é aqui que estava o erro anterior
contentType: "application/json",
dataType: 'json',
success: function(result){
console.log('resposta completa = ' + JSON.stringify(result));
console.log('é proprietário do grupo = ' + result.group.is_group_owner); //observe que isso será verdadeiro ou nulo
}
})
Eu estava recebendo a resposta “não autorizado” antes porque a URL anterior que eu estava inseria tinha o nome do grupo incorreto (estava sendo lido como “groupName”).