Feedjoltdocs
Desenvolupadors

SSO amb JWT

Autentica els teus usuaris al portal i el widget de Feedjolt amb un JWT efímer que signa el teu backend. Sense segon inici. Configura claims, secrets i rotació.

Si la teva aplicacio ja sap qui es l'usuari, no l'hauries d'obligar a iniciar sessio de nou per deixar feedback. Amb SSO per JWT el teu backend signa un token de curta durada que identifica l'usuari; Feedjolt el verifica al servidor i l'inicia de manera transparent al portal i al widget integrat.

Com funciona

  1. Configures un secret de signatura i un algorisme a Tauler -> Desenvolupadors -> SSO amb JWT.
  2. Quan un usuari autenticat obre el feedback, el teu backend genera un JWT amb les seves dades, signat amb aquest secret.
  3. Passes el token a Feedjolt: al widget mitjancant data-sso-token, o enviant-lo per POST a l'endpoint d'identificacio.
  4. Feedjolt verifica la signatura, crea o actualitza l'usuari final corresponent i estableix una cookie de sessio al servidor. Sense enllac magic, sense inici de sessio addicional.

El secret nomes viu al teu servidor i al de Feedjolt. El navegador nomes veu el token resultant, mai el secret.

Configuracio

El SSO per JWT es configura per espai de treball (nomes el propietari) a Tauler -> Desenvolupadors -> SSO amb JWT:

CampNotes
secret_keyEl teu secret de signatura compartit. De 16 a 512 caracters. Guarda'l nomes al servidor.
algorithmUn de HS256 (per defecte), HS384, HS512. Signatura HMAC amb secret compartit.
issuerOpcional. Si es defineix, el claim iss del token ha de coincidir.
audienceOpcional. Si es defineix, el claim aud del token ha de coincidir.
sync_modeUPSERT (per defecte) crea automaticament usuaris desconeguts; UPDATE_ONLY rebutja tokens d'usuaris que encara no existeixen.

Nomes s'admeten algorismes HMAC: no hi ha mode de clau publica (asimetric). Les dues parts comparteixen el mateix secret.

Claims del token

Genera un JWT estandard signat amb el teu secret. Aquests claims son obligatoris: un token al qual li falti qualsevol d'ells es rebutja.

ClaimSignificat
subEl teu ID d'usuari estable. S'usa com a ID extern de l'usuari final.
emailEl correu de l'usuari.
nameNom visible.
iatEmes el (claim estandard de JWT).
expCaducitat (claim estandard de JWT). Mante-la curta: minuts, no dies.

Els claims opcionals enriqueixen el perfil sincronitzat:

ClaimSignificat
avatar_urlURL de la imatge de perfil.
custom_fieldsObjecte de claus/valors arbitraris que es desa a l'usuari final.
companyObjecte que identifica l'empresa de l'usuari; vegeu mes avall.

Si has configurat un issuer o un audience, inclou tambe els claims iss / aud corresponents; nomes es verifiquen quan estan configurats.

Claim d'empresa

Passa company com a objecte per associar l'usuari a un registre d'empresa (creat o actualitzat al vol). Tambe s'accepta companies (un array): s'usa la primera entrada.

{
  "company": {
    "id": "org_123",
    "name": "Acme Inc",
    "plan": "enterprise",
    "mrr": 2400,
    "industry": "fintech",
    "employee_count": 120
  }
}

Per a una empresa nomes id i name son obligatoris; la resta es opcional.

Generar el token

Genera el JWT al teu backend, on el secret esta protegit. Mante exp curt: el token es d'un sol us per arrencar la sessio.

// Node.js - npm i jsonwebtoken
import jwt from "jsonwebtoken";

const token = jwt.sign(
  {
    sub: user.id,
    email: user.email,
    name: user.fullName,
    avatar_url: user.avatarUrl,
    company: { id: user.orgId, name: user.orgName },
  },
  process.env.FEEDJOLT_JWT_SECRET,
  { algorithm: "HS256", expiresIn: "5m" },
);
# Python - pip install pyjwt
import datetime, jwt

now = datetime.datetime.now(datetime.timezone.utc)
token = jwt.encode(
    {
        "sub": user.id,
        "email": user.email,
        "name": user.full_name,
        "avatar_url": user.avatar_url,
        "company": {"id": user.org_id, "name": user.org_name},
        "iat": now,
        "exp": now + datetime.timedelta(minutes=5),
    },
    FEEDJOLT_JWT_SECRET,
    algorithm="HS256",
)

Lliurar el token a Feedjolt

Widget: passa el token a l'atribut data-sso-token del loader (consulta Configuracio del widget). El widget el reenvia i l'usuari queda autenticat dins del panell.

Portal / directe: envia el token per POST a l'endpoint d'identificacio del teu espai de treball:

curl -X POST https://api.feedjolt.com/api/{workspace}/identify \
  -H "Content-Type: application/json" \
  -d '{"token": "EL_TEU_JWT_AQUI"}'

Si tot va be, Feedjolt retorna l'usuari final sincronitzat i estableix una cookie de sessio al servidor (httpOnly, secure, SameSite=Lax). Aquesta cookie, i no el teu JWT, es la que mante la sessio despres, aixi que nomes generes un JWT nou de curta durada en iniciar sessio.

Rotacio de claus

Rotar el secret de signatura no genera temps d'inactivitat. Quan deses un secret nou, Feedjolt mante valid l'anterior perque els tokens que ja circulen es continuin verificant. Durant la transicio s'accepten fins als ultims 5 secrets; els mes antics es descarten automaticament.

Per rotar: defineix el nou secret al tauler, desplega'l al teu backend i deixa que s'esgotin els tokens en circulacio. No cal cap canvi coordinat.

Notes de seguretat

  • La verificacio es del costat del servidor. Feedjolt valida la signatura, la caducitat i (si estan definits) l'issuer/audience als seus propis servidors. No confiis mai en una identitat declarada pel navegador.
  • El secret no arriba mai al navegador. Genera els tokens nomes al teu backend. Tracta el secret com una contrasenya.
  • Mante exp curt. El JWT nomes ha de durar el just per arrencar la cookie de sessio: amb minuts n'hi ha prou.
  • UPDATE_ONLY per a sistemes tancats. Si proporciones usuaris per una altra via i no vols que el SSO en crei de nous, defineix sync_mode com a UPDATE_ONLY.

On this page