# Beskytt en assistent med din egen pÃ¥logging via callbackUrl

`callbackUrl` er feltet du bruker nÃ¥r en coreAI-assistent skal vÃ¦re tilgjengelig bare for innloggede brukere i ditt eget system. NÃ¥r feltet er satt, kontakter coreAI din egen URL med brukerens token fÃ¸r chatwidgeten initialiseres, og bare brukere som ditt endepunkt godkjenner med HTTP 200 fÃ¥r snakke med assistenten. PÃ¥loggingen, sesjonen og brukerdatabasen blir hos deg â€“ coreAI eier ikke logikken for hvem som er hvem.

## NÃ¥r du bÃ¸r bruke callbackUrl

Bruk `callbackUrl` nÃ¥r assistenten svarer pÃ¥ data som ikke skal vÃ¦re offentlig: kundeportaler, intranett, ansattdokumenter eller flerkundelÃ¸sninger der hver bruker bare skal se sitt eget. Den typiske oppskriften er at brukeren logger inn hos deg, du embedder coreAI-widgeten pÃ¥ en beskyttet side, og widgeten sender med et token (din egen sesjons-ID, en JWT, en signert engangskode â€“ det du allerede bruker) som coreAI verifiserer mot ditt endepunkt fÃ¸r chatten starter.

Hvis assistenten skal svare alle som besÃ¸ker en Ã¥pen side, trenger du ikke `callbackUrl`. La feltet stÃ¥ tomt.

## To mÃ¥ter Ã¥ sende tokenet pÃ¥

`callbackUrl` stÃ¸tter to formater, og coreAI velger metode ut fra hvordan URL-en er skrevet:

- **`{TOKEN}` i URL-en.** Skriv `https://mitt-system.no/validate?token={TOKEN}`, sÃ¥ bytter coreAI plassholderen mot brukerens token og kaller URL-en med GET (faller tilbake til POST hvis GET gir 404). Plassholderen kan stÃ¥ hvor som helst i URL-en, ogsÃ¥ i stien: `https://mitt-system.no/validate/{TOKEN}` virker ogsÃ¥.
- **Bearer-header.** Skriv en fast URL uten `{TOKEN}`, for eksempel `https://mitt-system.no/api/validate`. coreAI kaller da URL-en med POST og legger ved `Authorization: Bearer <token>` (faller tilbake til GET hvis POST gir 404).

Velg det som er enklest Ã¥ bygge inn i din eksisterende auth-stack. Bearer-varianten passer best nÃ¥r du allerede har et JSON-API som validerer tokens; URL-varianten er enklest nÃ¥r validatoren er en standalone endpoint.

## Slik svarer endepunktet ditt

Endepunktet ditt mÃ¥ svare HTTP 200 med en JSON-kropp for Ã¥ slippe brukeren gjennom. Alt annet â€“ 401, 403, 500, nettverksfeil â€“ tolkes som avslag, og widgeten initialiseres ikke. Hvis svaret inneholder feltet `status`, mÃ¥ verdien vÃ¦re `"success"`; alt annet avslÃ¥r selv om statuskoden er 200.

JSON-svaret kan ogsÃ¥ returnere Ã©n eller flere `external_id`-er:

```json
{
  "status": "success",
  "external_id": ["customer-4711", "department-sales"]
}
```

NÃ¥r feltet er til stede, lÃ¥ser coreAI samtalen til datakildene som matcher disse `external_id`-ene i assistentens kunnskapsbase. Det er denne mekanismen som gjÃ¸r flerkundeportaler praktiske: Ã©n assistent, Ã©n kunnskapsbase, men hver bruker fÃ¥r bare se sine egne ordrer, sin egen organisasjons dokumenter, sitt eget innhold. Du bestemmer scopingen i ditt eget endepunkt â€“ coreAI leser bare resultatet.

## Hva som skrus av automatisk

SÃ¥ snart en assistent har en `callbackUrl` satt, slÃ¥r coreAI av tre overflater som ellers ville omgÃ¥tt sjekken:

- **Offentlig sÃ¸kedemo** â€“ sÃ¸ke-endepunktet for upubliserte demo-treff svarer 403.
- **Direktelenke til widgeten** â€“ den delbare URL-en som Ã¥pner widgeten alene i nettleseren returnerer 403.
- **MCP-eksponering** â€“ assistenten registreres ikke som en MCP-tool for AI-agenter.

Det er ingen vei utenom callbacken nÃ¥r den fÃ¸rst er satt. Hvis du vil eksponere noe offentlig igjen, mÃ¥ du fjerne `callbackUrl` eller opprette en separat assistent for den Ã¥pne overflaten.

## Hvorfor sjekken kjÃ¸res Ã©n gang per widget-lasting

Tokenet valideres nÃ¥r widgeten initialiseres â€“ altsÃ¥ Ã©n gang per sideinnlasting â€“ og ikke for hvert spÃ¸rsmÃ¥l brukeren stiller eller hver melding som strÃ¸mmes tilbake. Det er et bevisst valg. Ã
 validere pÃ¥ nytt for hvert chat-kall ville lagt nettverkslatens fra ditt endepunkt mellom hvert spÃ¸rsmÃ¥l og hvert svar, men ikke gitt noen reell sikkerhetsgevinst: tilgangen til assistenten avgjÃ¸res allerede av at widgeten ble lastet i en autentisert sesjon. En kompromittert sesjon hos deg ville sluppet gjennom uansett hvor ofte coreAI spurte.

I praksis betyr det at endepunktet ditt fÃ¥r Ã©n HTTP-forespÃ¸rsel per gang en bruker Ã¥pner siden assistenten ligger pÃ¥. Det er en realistisk last Ã¥ bygge for, ogsÃ¥ for endepunkter som gjÃ¸r tunge lookups mot databasen din.