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
- Configures un secret de signatura i un algorisme a Tauler -> Desenvolupadors -> SSO amb JWT.
- Quan un usuari autenticat obre el feedback, el teu backend genera un JWT amb les seves dades, signat amb aquest secret.
- Passes el token a Feedjolt: al widget mitjancant
data-sso-token, o enviant-lo per POST a l'endpoint d'identificacio. - 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:
| Camp | Notes |
|---|---|
secret_key | El teu secret de signatura compartit. De 16 a 512 caracters. Guarda'l nomes al servidor. |
algorithm | Un de HS256 (per defecte), HS384, HS512. Signatura HMAC amb secret compartit. |
issuer | Opcional. Si es defineix, el claim iss del token ha de coincidir. |
audience | Opcional. Si es defineix, el claim aud del token ha de coincidir. |
sync_mode | UPSERT (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.
| Claim | Significat |
|---|---|
sub | El teu ID d'usuari estable. S'usa com a ID extern de l'usuari final. |
email | El correu de l'usuari. |
name | Nom visible. |
iat | Emes el (claim estandard de JWT). |
exp | Caducitat (claim estandard de JWT). Mante-la curta: minuts, no dies. |
Els claims opcionals enriqueixen el perfil sincronitzat:
| Claim | Significat |
|---|---|
avatar_url | URL de la imatge de perfil. |
custom_fields | Objecte de claus/valors arbitraris que es desa a l'usuari final. |
company | Objecte 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
expcurt. El JWT nomes ha de durar el just per arrencar la cookie de sessio: amb minuts n'hi ha prou. UPDATE_ONLYper a sistemes tancats. Si proporciones usuaris per una altra via i no vols que el SSO en crei de nous, defineixsync_modecom aUPDATE_ONLY.
Resolució de problemes MCP
Soluciona errors comuns del MCP de Feedjolt: 402 pla requerit, 401 no autoritzat, 403 scope insuficient, 429 límit de taxa, etiqueta no trobada, i les proteccions en eliminar taulers i estats.
Sandbox i prova
Com agents i desenvolupadors proven Feedjolt sense una trucada de vendes: alta autoservei, prova Growth i claus API a Startup.
