Legal

OAuth 2.0 & OpenID Connect SSO

Komplet guide til at integrere OpenID Connect single sign-on med Advanza.

Last updated: 26. august 2026

Oversigt

Advanza er en multitenant SaaS-markedsføringsplatform, der understøtter OpenID Connect (OIDC) og OAuth 2.0 til sikker autentificering og single sign-on (SSO). Denne guide dækker understøttede flows, endepunkter, scopes og best practices for at integrere Advanza-autentificering i dine applikationer.

Protokol: OpenID Connect 1.0 (bygget på OAuth 2.0 Authorization Code Grant)
Udbyder: Advanza (via OpenIddict 5.x)
Multi-tenancy: Fuld understøttelse – hver organisation er en separat tenant
Sikkerhed: HTTPS påkrævet, PKCE anbefales til SPA'er, certifikater til fortrolige klienter

Understøttede autentificeringsflows

Authorization Code Flow (anbefalet)

OAuth 2.0 Authorization Code Flow er det anbefalede og mest sikre flow til de fleste applikationer, inklusive webapps og single-page-applikationer (SPA'er). Det bruger PKCE (Proof Key for Code Exchange) til offentlige klienter for at forhindre angreb, hvor autorisationskoden opsnappes.

Bedst til: Webapplikationer, SPA'er, mobilapps, tredjepartsintegrationer

Refresh Token Flow

Brug refresh tokens til at hente nye adgangstokens, uden at brugeren skal logge ind igen. Refresh tokens er gyldige i 14 dage og kan roteres for at bevare sikkerheden.

Bedst til: Langvarige sessioner, baggrundstjenester, offline adgang

Client Credentials Flow (legacy)

OAuth 2.0 Resource Owner Password Credentials-flowet understøttes for bagudkompatibilitet med legacy-integrationer. Nye integrationer bør i stedet bruge Authorization Code Flow.

Bedst til: Legacy-applikationer, interne værktøjer (anbefales ikke til ny udvikling)

API-endepunkter

Alle endepunkter er hostet på https://api.advanza.ai

Authorization-endepunkt

GET /connect/authorize

Starter OAuth-autorisationsflowet. Omdirigerer brugeren til at logge ind hos sin identitetsudbyder (Microsoft, Google eller e-mail/adgangskode).

Query-parametre:

  • client_id (påkrævet): Dit applikations-ID
  • redirect_uri (påkrævet): URL der omdirigeres til efter autentificering
  • response_type (påkrævet): Skal være 'code'
  • scope (påkrævet): Mellemrumsadskilt liste af scopes (openid, email, profile, offline_access, roles)
  • code_challenge (påkrævet til SPA): PKCE code challenge
  • code_challenge_method (påkrævet sammen med code_challenge): 'S256'
  • state (anbefalet): Tilfældig streng, der forhindrer CSRF-angreb
  • tenant_id (valgfri): Specifik tenant, der skal autentificeres til

Token-endepunkt

POST /connect/token

Udveksler en autorisationskode til adgangstokens, ID-token og valgfrit refresh token.

Anmodningsformat: application/x-www-form-urlencoded

Parametre:

  • grant_type (påkrævet): 'authorization_code', 'refresh_token' eller 'password'
  • code (påkrævet ved auth code-flow): Autorisationskode fra /authorize
  • client_id (påkrævet): Dit applikations-ID
  • client_secret (påkrævet): Din applikationshemmelighed (skal holdes fortrolig)
  • redirect_uri (påkrævet): Skal matche /authorize-anmodningen
  • code_verifier (påkrævet til SPA): PKCE code verifier
  • refresh_token (til refresh-flow): Det refresh token, der skal udveksles
  • username & password (til password-flow): Brugerens loginoplysninger

Token Introspection-endepunkt

POST /connect/introspect

Validerer og inspicerer indholdet af et adgangstoken eller refresh token.

OpenID-konfiguration

GET /.well-known/openid-configuration

Standard OIDC-metadataendepunkt. Returnerer discovery-information, herunder endepunkter, offentlige nøgler, understøttede scopes og grant types.

Scopes

Anmod om scopes via scope -parameteren på autorisationsanmodningen:

openid (påkrævet)

Anmoder om et ID-token med brugerens identitetsoplysninger (subject claim, navn, tenant-ID osv.)

email

Anmoder om brugerens e-mailadresse og verifikationsstatus for e-mail

profile

Anmoder om brugerens profiloplysninger: name, given_name, family_name

offline_access

Anmoder om et refresh token, der udvider adgangen uden gentagen autentificering

roles

Anmoder om brugerens roller/rettigheder (f.eks. "Owner", "Editor", "Viewer")

Minimum scope til login: openid email profile

Eksempel: Authorization Code Flow med PKCE

Dette eksempel demonstrerer det anbefalede flow til single-page-applikationer (SPA'er) og mobilapps.

Trin 1: Generér PKCE-udfordring

Opret en code verifier og challenge på klientsiden:

// 1. Generate random code verifier (43-128 characters)
const codeVerifier = generateRandomString(128);

// 2. Create code challenge via SHA256 hash
const codeChallenge = await crypto.subtle.digest('SHA-256',
  new TextEncoder().encode(codeVerifier)
);

// 3. Base64-URL encode the challenge
const codeChallengeB64 = base64UrlEncode(codeChallenge);

// Store codeVerifier in sessionStorage for Step 3
sessionStorage.setItem('pkce_verifier', codeVerifier);

Trin 2: Omdiriger til Authorization-endepunktet

Send brugeren hen for at logge ind:

GET /connect/authorize?
  client_id={your_app_id}
  &redirect_uri=https://your-app.com/callback
  &response_type=code
  &scope=openid email profile
  &code_challenge={pkce_challenge}
  &state={random_state}

Brugeren bliver omdirigeret til sin identitetsudbyder (Microsoft, Google eller e-mail/adgangskode), gennemfører autentificeringen og bliver sendt tilbage til din redirect_uri med en autorisationskode.

Trin 3: Udveksl kode til tokens

Fra din backend udveksles autorisationskoden:

POST /connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code={auth_code}
&client_id={your_app_id}
&client_secret={your_app_secret}
&redirect_uri=https://your-app.com/callback
&code_verifier={pkce_verifier}

Trin 4: Token-svar

Ved succes modtager du:

{
  "access_token": "eyJhbGciOiJSUzI1NiIs...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "DefxA1234567890...",
  "id_token": "eyJhbGciOiJSUzI1NiIs..."
}

Trin 5: Verificér ID-token

Validér ID-tokenets signatur ved hjælp af den offentlige nøgle fra /.well-known/openid-configuration, verificér issuer- og audience-claims, og udtræk brugeroplysningerne.

Token-claims

ID-token claims

ID-tokenet (JWT) indeholder brugerens identitetsoplysninger:

{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "email": "user@company.com",
  "email_verified": true,
  "name": "John Doe",
  "given_name": "John",
  "family_name": "Doe",
  "tenant_id": "12345678-1234-1234-1234-123456789012",
  "iss": "https://api.advanza.ai",
  "aud": "your_app_id",
  "iat": 1234567890,
  "exp": 1234571490
}

Vigtige claims:

  • sub: Unik bruger-ID (Guid)
  • email: Brugerens e-mailadresse
  • email_verified: Om e-mailen er verificeret
  • name, given_name, family_name: Brugerens navn
  • tenant_id: Brugerens aktive tenant/organisation
  • iss: Token-udsteder (altid https://api.advanza.ai)
  • aud: Tilsigtet modtager (dit applikations-ID)
  • iat: Token udstedt (Unix-timestamp)
  • exp: Token udløber (Unix-timestamp)

Access token claims

Adgangstokenet (JWT) indeholder autorisationsoplysninger:

{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "email": "user@company.com",
  "name": "John Doe",
  "tenant_id": "12345678-1234-1234-1234-123456789012",
  "roles": ["Owner"],
  "scope": "openid email profile offline_access roles",
  "iss": "https://api.advanza.ai",
  "aud": "your_app_id",
  "iat": 1234567890,
  "exp": 1234571490
}

Vigtige claims:

  • sub: Bruger-ID
  • email, name: Brugeroplysninger
  • tenant_id: Aktiv tenant (brug til multi-tenancy-routing)
  • roles: Brugerens roller i tenanten
  • scope: Tildelte scopes
  • exp: Udløb (typisk 1 time)

Brug adgangstokenet til: Inkludér i Authorization-headeren (Authorization: Bearer {access_token}), når du kalder Advanza-API'er eller din backend.

Multi-tenancy

Advanza er en multitenant-platform. Hver bruger kan være medlem af flere organisationer (tenants). Claimet tenant_id i både ID- og adgangstoken angiver brugerens aktive tenant-kontekst.

Standard-tenant

Ved første login tildeles brugeren en standard-tenant. Claimet tenant_id bliver udfyldt med denne tenants ID.

Skift af tenant

Brugere med flere tenant-medlemskaber kan skifte tenant ved at sende den ønskede tenant_id -parameter til authorization-endepunktet:

GET /connect/authorize?
  client_id={your_app_id}
  &redirect_uri=https://your-app.com/callback
  &response_type=code
  &scope=openid email profile
  &tenant_id=12345678-1234-1234-1234-123456789012
  &code_challenge={pkce_challenge}

Routing efter tenant

Brug tenant_id -claimet til at route anmodninger til den korrekte tenant-kontekst i din backend:

// Extract tenant from token claims
const tenantId = tokenClaims.tenant_id;

// Route request to tenant context
const tenantContext = getTenantContext(tenantId);
const result = await performAction(tenantContext, action);

Best practices for sikkerhed

Brug HTTPS i produktion

Alle OAuth-anmodninger skal bruge HTTPS for at beskytte loginoplysninger og tokens.

PKCE til SPA'er og mobilapps

Brug altid PKCE (Proof Key for Code Exchange) til offentlige klienter. Det forhindrer angreb, hvor autorisationskoden opsnappes.

Hold client secret fortroligt

Eksponér aldrig din client secret i klientsidekode, logs eller versionsstyring. Brug det kun i sikker backend-til-backend-kommunikation.

Validér state-parameteren

Generér og validér altid state -parameteren for at forhindre CSRF-angreb.

Verificér token-signaturer

Validér altid signaturerne på ID-token og adgangstoken ved hjælp af den offentlige nøgle fra OIDC-konfigurationsendepunktet, før du stoler på deres indhold.

Opbevar refresh tokens sikkert

Gem refresh tokens sikkert (HttpOnly-cookies eller sikker lagring, ikke localStorage). Sæt passende udløbstider.

Håndtér token-udløb

Adgangstokens udløber efter 60 minutter. Implementér token refresh-logik for at bevare uafbrudt adgang.

Support

Har du spørgsmål, problemer eller brug for hjælp til integrationen, så kontakt vores supportteam:

E-mail: support@advanza.ai
Dokumentation: https://advanza.ai/docs
Status: https://status.advanza.ai