Come usare la chiave API in una chiamata AJAX?

Sto cercando di ottenere programmaticamente informazioni su un gruppo dall’API di Discourse. Ho il codice per questo nel mio pannello di personalizzazione, sotto . Sono l’amministratore del mio forum.

Non funziona e penso che possa essere perché non capisco come funzionano le chiavi API.

Se voglio che Discourse faccia una chiamata all’API per ottenere informazioni su un gruppo ogni volta che un utente visita una determinata pagina, qual è la configurazione corretta della chiave API?

Questo è quanto ho finora:

Nel mio pannello di controllo, sono andato su API → Nuova chiave API. Lì, devo selezionare “Livello utente”. Scusa per la domanda basilare, ma cosa significa “Livello utente” qui? (la chiamata API deve essere eseguita ogni volta che un utente qualsiasi va alla pagina data).

Ho selezionato “Tutti gli utenti”. Quindi ho generato il token.

Poi, nel mio pannello di personalizzazione CSS/HTML sotto , ho inserito quanto segue tra i tag <script> pertinenti:

var groupName = [NOME DEL GRUPPO PERTINENTE]
var token = [TOKEN CHE HO GENERATO]
$.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);
         }
})

Il codice viene eseguito, ma restituisce un errore che indica “non autorizzato” (anche se sono un amministratore e un membro del gruppo che sto usando per fare esperimenti).

Cosa devo cambiare?

Non rischia forse di esporre la tua API Key per tutti gli utenti a chiunque possa visualizzare il tuo sito? Credo che dovrai trovare un altro approccio per ottenere i dati del gruppo da un componente del tema.

Se le informazioni sul gruppo di cui hai bisogno non sono presenti nel JSON caricato a disposizione dell’utente, devi capire come aggiungerle al serializzatore. Cercare “add to serializer” o forse addToSerializer o add_to_serializer nei componenti del tema e nei plugin esistenti potrebbe essere d’aiuto.

Ma il codice non dovrebbe funzionare in ogni caso? L’API offre la possibilità di ottenere informazioni su un gruppo. Ammetto di essere ancora confuso su come dovrebbe funzionare.

Qual è il modo normale di utilizzare l’API per ottenere informazioni su un gruppo specifico?

L’informazione chiave che mi serve è sapere se l’utente è o meno il proprietario del gruppo. Queste informazioni vengono restituite dall’API JSON. Quindi, quando un utente accede a una pagina specifica, voglio effettuare una chiamata all’API per ottenere informazioni sul gruppo; nella risposta di base è incluso anche se l’utente loggato nel client è il proprietario.

Questa sembra un’implementazione diretta dell’API. Tuttavia, sembra che questa operazione richieda una chiave API, ma il metodo che ho utilizzato finora non funziona.

Non credo che sia necessario creare un plugin o un componente del tema separato, dato che questa è una delle operazioni di base fornite dall’API JSON.

Mi chiedo se esista un modo per utilizzare l’API con una chiave senza esporla (cioè, qual è il metodo standard o migliore per utilizzare l’API).

EDIT: Se per qualche motivo questo non è appropriato per la chiamata API, allora sì, dovrebbe essere serializzato. Qualcuno ha del codice funzionante per questo? So che esiste un metodo add_to_serializer, ma non sono riuscito a far funzionare correttamente la sintassi e ho faticato a trovare esempi funzionanti del metodo.

Gentile @JQ331,

Sì, ho effettuato una rapida verifica per te (come riferimento) e ho accesso a un forum di test come membro dello staff, recuperando il gruppo staff, ottenendo i risultati attesi:

Oggetto JSON per il gruppo staff da parte di un membro dello staff
{
  "group": {
    "id": 3,
    "automatic": true,
    "name": "staff",
    "display_name": "staff",
    "user_count": 1,
    "mentionable_level": 0,
    "messageable_level": 0,
    "visibility_level": 1,
    "automatic_membership_email_domains": null,
    "primary_group": false,
    "title": null,
    "grant_trust_level": null,
    "incoming_email": null,
    "has_messages": false,
    "flair_url": null,
    "flair_bg_color": null,
    "flair_color": null,
    "bio_raw": null,
    "bio_cooked": null,
    "bio_excerpt": null,
    "public_admission": false,
    "public_exit": false,
    "allow_membership_requests": false,
    "full_name": null,
    "default_notification_level": 3,
    "membership_request_template": null,
    "is_group_user": true,
    "is_group_owner": true,
    "members_visibility_level": 0,
    "can_see_members": true,
    "publish_read_state": false,
    "is_group_owner_display": false,
    "mentionable": false,
    "messageable": false
  },
  "extras": {
    "visible_group_names": [
      "admins",
      "moderators",
      "staff",
      "trust_level_0",
      "trust_level_1",
      "trust_level_2",
      "trust_level_3",
      "trust_level_4"
    ]
  }
}

… e ho anche provato a fare la stessa cosa senza essere loggato, ottenendo il risultato atteso:

{"errors":["Non sei autorizzato a visualizzare la risorsa richiesta."],"error_type":"invalid_access"}

Quindi, questo significa, o almeno così sembra a me, che tutto funziona come dovrebbe.

Per tua informazione @JQ331, non ho avuto bisogno di una chiave API per questa azione come utente loggato (dal browser).

    "is_group_owner": true,

@neounix: Grazie mille per la tua risposta. Ha messo fine alla mia ricerca inutile. Pensavo che la risposta non autorizzata fosse dovuta a un problema di autenticazione.

Invece, hai ragione: per questa azione non è necessaria alcuna chiave API. Piuttosto, si trattava di un errore (semplice) nel codice, evidente dal codice che ho pubblicato sopra, ma che avevo trascurato prima (stavo inserendo erroneamente la variabile per l’URL AJAX).

Ecco il codice funzionante:

var groupName = [NOME DEL GRUPPO RILEVANTE]
var token = [TOKEN CHE HO GENERATO]
$.ajax({
     url: 'https://myforum.com/groups/' + groupName + '.json',    //qui era l'errore precedente
      contentType: "application/json",
        dataType: 'json',
        success: function(result){
             console.log('risposta completa = ' + JSON.stringify(result));
             console.log('è proprietario del gruppo = ' + result.group.is_group_owner);  //nota: questo sarà true o null           
     }
})

Prima ricevevo la risposta non autorizzata perché l’URL precedente che inserivo aveva il nome del gruppo errato (veniva letto come “groupName”).