Wat is een JWT?
Een JSON Web Token (JWT) is een versleuteld tokenformaat dat gegevens, zoals authenticatie- en autorisatiegegevens, veilig tussen twee applicaties overdraagt. In Document360 wordt JWT gebruikt om lezersloggegevens te authenticeren. Klik hier om meer te lezen over JWT.
Document360 gebruikt een benadering vergelijkbaar met PKCE (Proof Key for Code Exchange, een veilige OAuth-methode) om het JWT-token te genereren.
Enterprise SSO met JWT in Document360
Document360 ondersteunt JWT als een van zijn SSO (Single Sign-On) methoden voor het authenticeren van lezerslogins. Het biedt een veilige manier om authenticatie- en autorisatiegegevens over te dragen tussen uw applicatie en uw Document360 Knowledge base
Je kunt tot 5 JWT-configuraties per project maken. Tot 3 daarvan kunnen als inlogknoppen verschijnen op de inlogpagina met de lezer. Als je er meer dan 3 hebt, kunnen lezers nog steeds de resterende configuraties bereiken door hun domeinnaam in het domeinnaaminvoerveld op de inlogpagina in te voeren.
JWT werkt ook samen met SSO-providers zoals SAML en OpenID, je kunt ze allemaal tegelijk actief hebben in hetzelfde project.
De juiste SSO-methode kiezen: JWT vs SAML vs OpenID
Document360 ondersteunt drie SSO-opties voor lezerauthenticatie: JWT, SAML en OpenID Connect. De juiste methode kiezen hangt af van hoe je gebruikers beheert, welke infrastructuur je al hebt en hoeveel controle je nodig hebt over het inlogproces.
De onderstaande tabel vergelijkt JWT met de andere opties:
Kenmerk | JWT | SAML / OpenID |
|---|---|---|
Lezersbeheer | Lezers worden geauthenticeerd vanuit je eigen applicatie. Je hoeft lezersaccounts niet handmatig aan te maken of te beheren in het Document360-portaal. | Lezers worden beheerd via de identiteitsprovider (IdP) van uw organisatie, zoals Okta, Azure AD of Google Workspace. |
Loginbestemming | JWT-inlogs leiden altijd door naar de kennisbanksite. Zelfs als de gebruiker een teamlid is, kan hij of zij het Document360-portaal niet bereiken via JWT. | Kan zowel lezer- als team-inlogs ondersteunen, afhankelijk van de configuratie. |
Wanneer te gebruiken | Ideaal als je geen IdP hebt, of liever authenticatie in je eigen app beheert. | Aanbevolen als je organisatie al een IdP gebruikt en gecentraliseerde authenticatie en toegangscontrole wil. |
Gebruikersregistratiestroom | Je beheert het inloggen en de gebruikersprovisioning in je eigen app. | Kan functies ondersteunen zoals zelfregistratie, wachtwoordreset en gebruikerslevenscyclusbeheer (afhankelijk van de IdP). |
SSO-inlogpagina | Je definieert de Aanmeld-URL en optioneel de Uitlogg-URL in de JWT-configuratie-instellingen. | De inlogpagina wordt afgehandeld door de IdP, en de doorverwijzingen worden beheerd via SAML/OpenID-instellingen. |
Geavanceerde functies | Sommige functies worden niet ondersteund met JWT, zoals: – SSO-lezers automatisch registreren– Het overslaan van de gebruikelijke aanmeldpagina van Document360 – Lezer zelfregistratie | Deze geavanceerde functies zijn beschikbaar afhankelijk van de capaciteiten van de IdP. |
Implementatie | Eenvoudigere opzet voor ontwikkelaars. Je genereert de JWT, ondertekent deze met een clientgeheim dat in Document360 is aangemaakt, en verzorgt de authenticatie in je app. | Vereist configuratie van IdP-metadata, certificaten en mappings met Document360. |
Hoe JWT werkt
Het onderstaande hoog-niveau diagram toont hoe je JWT in Document360 kunt bereiken.

De onderstaande stappen leggen de volledige JWT-authenticatieflow in Document360 uit voor ontwikkelaars die een reader SSO instellen met hun eigen inlogsysteem.
Belangrijke terminologie
Term | Beschrijving |
|---|---|
Login-URL | Een openbare inlogpagina in je applicatie waar gebruikers worden doorgestuurd om te authenticeren. |
Code generatie URL | Beveiligde backend-endpoint in je app die gebruikersgegevens naar Document360 stuurt om een autorisatiecode te verkrijgen. |
Callback-URL | De URL in Document360 waar je app de gebruiker doorverwijst nadat hij de autorisatiecode heeft ontvangen. Dit wordt automatisch gegenereerd door Document360. |
Authenticatieflow
Gebruiker krijgt toegang tot de privé kennisbank
Wanneer een gebruiker probeert toegang te krijgen tot uw kennisbanksite, detecteert Document360 dat JWT SSO is ingeschakeld en verwijst de gebruiker naar de aanmeld-URL die in JWT-instellingen is geconfigureerd.
Gebruiker logt in bij je applicatie
Als de gebruiker nog niet geauthenticeerd is, verzorgt je inlogpagina hun authenticatie.
Je backend vraagt om een eenmalige authenticatiecode
Nadat de gebruiker is ingelogd, stuurt je backend een
POSTverzoek naar de codegeneratie-URL die in Document360 is geconfigureerd met het volgende:Gebruikersidentiteit (bijv. naam, e-mail)
Optioneel
readerGroupIdstokenValidityBinnen enkele minuten
Dit verzoek moet worden geautoriseerd met HTTP Basic Auth met uw Client ID en Client Secret.
Voorbeeld autorisatieheader
Authorization: Basic Base64Encode(clientId:clientSecret)JSON Payload voorbeeld
{
"username": "firstname + lastname",
"firstName": "firstname",
"lastName": "lastname",
"emailId": "user email",
"readerGroupIds": ["Obtain from Reader groups overview page in the Document360 portal (Optional)"],
"tokenValidity": 15 //minutes
}OPMERKING
Zorg voor correcte JSON-syntaxis om configuratiefouten te voorkomen.
De Document360 Identity-server geeft een authenticatiecode terug
Als het verzoek geldig is, genereert de identiteitsserver van Document360 een eenmalige autorisatiecode en stuurt deze terug naar je app (backend).
Je app stuurt de gebruiker terug naar Document360
Je backend voegt de code toe aan de Callback-URL en stuurt de gebruiker ernaartoe.
Bijvoorbeeld:
https://yourproject.document360.io/jwt/authorize?code=xyz
OPMERKING
De authenticatiecode is een eenmalige gebruikscode en kan niet opnieuw worden gebruikt.
Document360 valideert de code
Zodra de code is ontvangen, stuurt Document360 deze via backchannel naar de identiteitsserver om deze uit te wisselen voor een JWT-token.
Er wordt een lezersessie aangemaakt
Document360 haalt gebruikersinformatie en toegangsregels (gebaseerd op
readerGroupIds) uit het token.Er wordt een sessie voor de lezer aangemaakt, waardoor hij toegang krijgt tot toegestane categorieën, talen of versies.
Tokenvaliditeit en sessiegedrag
Je kunt de sessieduur definiëren met het
tokenValidityveld in de payload (min: 5 minuten, maximaal: 1440).Zodra de token verloopt:
De lezer wordt teruggeleid naar je aanmeld-URL.
Als de gebruiker nog steeds geauthenticeerd is in je app, wordt er een nieuwe code gegenereerd en wordt de sessie naadloos opnieuw ingesteld.
JWTconfigureren in Document360
Configureer JSON Web Token (JWT)-authenticatie zodat lezers veilig kunnen inloggen met tokens van je applicatie of identiteitsprovider. Je kunt tot 5 JWT-configuraties per project aanmaken, met maximaal 3 als inlogknoppen weergegeven op de inlogpagina van de lezer voor snelle toegang. Extra JWT-opties blijven toegankelijk via het veld Domeinnaam. JWT werkt naadloos samen met SSO-providers zoals SAML en OpenID, waardoor meerdere authenticatiemethoden naast elkaar kunnen bestaan in hetzelfde project.
Om toegang te krijgen tot de JWT-pagina, ga naar Instellingen > Gebruikers & rechten > JWT.
.png)
Nieuw bij JWT op Document360
Als er geen JWT-configuratie in uw project bestaat, voltooi dan de volgende stappen in volgorde:
Configure JWT login — configureer gedeelde projectinstellingen op niveau.
Maak een JWT-configuratie — voeg je eerste JWT-configuratie toe.
Stel je applicatie in — koppel je applicatie aan Document360.
Extra JWT-configuraties en SSO-providers (SAML of OpenID) kunnen op elk moment aan hetzelfde project worden toegevoegd zonder dat bestaande configuraties worden beïnvloed.
Bestaande JWT-configuratie
Als je JWT vóór juni 2026 hebt ingesteld, verschijnt je bestaande configuratie in een alleen-lezen weergave. Je huidige JWT-configuratie blijft actief en lezers kunnen zich zonder onderbreking blijven aanmelden.
Wanneer je naar Instellingen > Gebruikers & Rechten > JWT gaat, kun je:
Blijf de configuratie gebruiken: Geen wijzigingen nodig.
Bewerk de configuratie: Klik op het Bewerken-icoon om de instellingen bij te werken.
Verwijder de configuratie: Klik op het Verwijderen-icoon om het te verwijderen.
Voeg een andere JWT-configuratie toe
Klik op Create JWT om een nieuwe configuratie toe te voegen. Vervolgens configureer JWT-login en maak JWT-configuraties om extra JWT-configuraties te maken. Een project kan tot 5 JWT-configuraties hebben. Na het opslaan schakelt de pagina over naar de lijstweergave en toont alle geconfigureerde JWT-vermeldingen. Je bestaande configuratie blijft ongewijzigd
Configureer SSO naast JWT
Ga naar Instellingen > Gebruikers & Rechten > SSO-configuratie en stel je SSO-provider in. Je JWT-configuratie wordt helemaal niet beïnvloed. Beide zijn tegelijkertijd actief en lezers zullen beide opties op de inlogpagina zien. Zie JWT en SSO coëxistentie voor details over hoe de inlogpagina eruitziet.
Stap 1 — Configureer JWT-login
Klik op 'JWT inlogen configureren ' in de banner op de JWT-pagina om de configuratiemodus te openen.

Authenticatie
Dit zijn alleen-lezen waarden die door Document360 worden gegenereerd. Kopieer ze met de knop Kopiëren en configureer ze in je identiteitsprovider.
Veld | Beschrijving |
|---|---|
Callback-URL | De doorverwijzings-URL waar de identiteitsprovider lezers naartoe stuurt na succesvolle authenticatie. Registreer dit in je IdP om het aanmeldproces te voltooien. |
Code generatie URL | Het eindpunt Document360 roept aan om het token op te halen dat wordt gebruikt om lezers in te loggen. |
Andere instellingen
Direct JWT-login
Standaard: AAN
Wanneer ingeschakeld, worden lezers direct doorgestuurd naar JWT-aanmelding zonder dat er een inlogselectiescherm wordt getoond. Dit is passend wanneer JWT de enige authenticatiemethode is voor je kennisbank.
Wanneer uitgeschakeld, krijgen lezers een inlogselectiescherm te zien met alle geconfigureerde aanmeldopties — JWT, SSO en de standaard Document360-login. Schakel deze instelling uit wanneer meerdere authenticatiemethoden actief zijn en lezers hun aanmeldmethode moeten kiezen. Een bevestiging is vereist voordat deze wijziging wordt toegepast.
Wanneer meerdere JWT-configuraties en SSO zijn ingesteld, maar de projecteigenaar wil dat lezers alleen via JWT-authenticatie inloggen, kunnen ze Direct JWT-login inschakelen.
Schakel de standaard inlogpagina uit
Standaard: UIT
Wanneer ingeschakeld, is de standaard Document360 e-mail- en wachtwoordlogin verborgen. Lezers kunnen alleen authenticeren via geconfigureerde JWT- of SSO-providers. Dit wordt typisch gebruikt in bedrijfsomgevingen waar alle toegang tot lezers moet worden beheerd via een gecentraliseerd identiteitssysteem.
OPMERKING
Schakel deze instelling alleen in nadat JWT- of SSO-authenticatie volledig is geconfigureerd en getest. Als de externe authenticatieprovider verkeerd is geconfigureerd, kunnen lezers geen toegang krijgen tot de kennisbank.
Klik op Sluiten om de modal te verwijzen. Wijzigingen worden onmiddellijk doorgevoerd.
Stap 2 — Maak een JWT-configuratie aan
Klik op de JWT-pagina rechtsboven op 'JWT aanmaken '. De Create JWT-modal opent.

Naam
Voer een beschrijvende naam in om deze configuratie te identificeren - bijvoorbeeld Customer Portal SSO. Deze naam verschijnt in de JWT-lijst in het portaal. Als de inlogknop is ingeschakeld, wordt deze naam ook aan lezers op de inlogpagina weergegeven, dus het zou betekenisvol moeten zijn voor het publiek dat inlogt.
Authenticatie
Veld | Verplicht | Beschrijving |
|---|---|---|
Klant-ID | Ja | Automatisch gegenereerd door Document360. Dit is de unieke identificatie voor deze JWT-configuratie. Kopieer het met het kopieerpictogram en voeg het toe aan je clientapplicatie. |
Login-URL | Ja | De URL in je applicatie waar lezers naartoe worden gestuurd om te authenticeren (bijv. |
Domeinnaam | Ja | Automatisch afgeleid van de Login URL. Dit is het domein dat geassocieerd is met deze JWT-configuratie. Wanneer een lezer dit domein invoert op de inlogpagina, wordt hij doorgestuurd naar de Login-URL van deze configuratie. Het domein moet uniek zijn over alle JWT-configuraties in het project. |
Uitlog-URL | Nee | De URL waarnaar lezers worden doorgestuurd na het uitloggen (bijv. |
Regels voor domeinnaamvalidatie:
Subdomeinen worden behandeld als afzonderlijke elementen.
portal.example.comenexample.comzijn aparte domeinen en kunnen aan verschillende configuraties worden toegewezen.Wildcard-domeinen zoals deze
*.example.comworden niet ondersteund. Elk domein moet een exacte waarde hebben.Een domein dat al aan een andere JWT-configuratie in hetzelfde project is toegewezen, kan niet opnieuw worden gebruikt. Een inline validatiefout wordt weergegeven bij het opslaan.
JWT-sleutels
BELANGRIJK
Geheime tokens worden slechts één keer getoond op het moment van creatie. Kopieer en bewaar ze veilig voordat je de modal sluit. Als ze verloren gaan, moeten ze worden geregenereerd, wat de vorige tokens onmiddellijk ongeldig maakt.
Document360 genereert automatisch twee geheime tokens wanneer de modal opent. Deze tokens zijn alleen in platte tekst zichtbaar tijdens deze sessie. Zodra de modal is gesloten, worden ze gemaskeerd en kunnen ze niet meer worden teruggehaald.
Token | Doel |
|---|---|
Primaire geheime token | Ondertekent en verifieert JWT-authenticatieverzoeken tussen je applicatie en Document360. Dit token moet vertrouwelijk worden behandeld. Als je gecompromitteerd bent, genereer deze dan onmiddellijk opnieuw en werk je applicatie bij om ongeautoriseerde toegang te voorkomen. |
Secundair geheim token | Dient als back-up ondertekeningssleutel om de rotatie van inloggegevens te ondersteunen zonder onderbreking van de dienst. Tijdens een rotatie maakt het secundaire token het mogelijk om authenticatie voort te zetten terwijl het primaire token wordt bijgewerkt. |
Gebruik het Kopieer-icoon naast elk token om de waarde te kopiëren.
Geavanceerde instellingen
Vouw de Geavanceerde instellingen uit om de volgende opties te configureren.
Schakel JWT-authenticatie in
Standaard: AAN
Wanneer ingeschakeld, is deze configuratie actief en kunnen lezers deze gebruiken om in te loggen. Het uitschakelen deactiveert de configuratie zonder deze te verwijderen, wat handig is om een configuratie tijdelijk op te schorten zonder de instellingen te verliezen.
Toon inlogknop
Standaard: UIT
Wanneer ingeschakeld, verschijnt er een merk-loginknop voor deze configuratie op de kennisbank-inlogpagina. Dit biedt lezers een directe aanmeldoptie zonder dat ze een domeinnaam hoeven in te voeren.
OPMERKING
Maximaal 3 JWT-inlogknoppen kunnen gelijktijdig op de inlogpagina worden weergegeven. Wanneer deze limiet is bereikt, wordt de toggle automatisch uitgeschakeld voor extra configuraties. Lezers die zijn toegewezen aan configuraties zonder zichtbare knop kunnen zich nog steeds authenticeren door hun domeinnaam in het domeinnaamveld op de inlogpagina in te voeren, wat hen naar de juiste configuratie stuurt.
Wanneer de knop Inlogknop Weergeven is ingeschakeld, zijn de volgende extra velden beschikbaar:
Tekst van de inlogknop — het label dat op de knop wordt weergegeven. Dit zou duidelijk de authenticatiebron voor lezers moeten identificeren.
Logo van de inlogknop — een afbeelding die is geüpload om de knop te merken. Geaccepteerde formaten: JPG, PNG, SVG Maximale bestandsgrootte: 512 KB.
Stap 3 — Stel je aanvraag in
Kopieer de volgende waarden uit de JWT-configuratie en voeg ze toe aan de bijbehorende velden in je clientapplicatie:
Klant-ID
Callback-URL
Code generatie URL
Primaire geheime token
Secundair geheim token
Sla de configuratie op
Klik op Aanmaken. De knop blijft inactief totdat alle vereiste velden geldige waarden bevatten. Bij succes sluit de modal en verschijnt de nieuwe configuratie in de JWT-lijst.
OPMERKING
Lezers hebben geen apart Document360-account nodig. Authenticatie wordt volledig via je applicatie afgehandeld. Een account in je applicatie is voldoende voor een lezer om toegang te krijgen tot de kennisbank
Ontwikkelaarschecklist
Registreer de Login-URL, Callback-URL en Codegeneratie-URL in je JWT-instellingen.
Bewaar het klantgeheim veilig. Het wordt slechts één keer getoond op het moment van creatie.
Implementeer backendlogica om de Code generatie-URL aan te roepen met HTTP Basic Auth.
Onderteken de JWT in je backend met je client secret. Stel nooit de signinglogica bloot aan de clientzijde.
Handhaaf HTTPS op alle endpoints die betrokken zijn bij de authenticatieflow.
Testsessiegedrag, tokenverloop en automatische sessieverlenging voordat het live gaat.
Monitor backend-logs op 401-fouten, die doorgaans wijzen op verlopen autorisatiecodes of token-mismatches.
Implementatie van de JWT SSO-redirect-logica
Na het voltooien van de JWT-configuratie in Document360 heeft uw applicatie een backendroute nodig om de laatste stap van de inlogflow af te handelen.
Deze route:
Valideert dat de gebruiker al geauthenticeerd is in je applicatie
Stuurt een beveiligd verzoek naar de codegeneratie-URL van Document360
Haalt een eenmalige autorisatiecode op
Leidt de gebruiker door naar de kennisbanksite met die code
/// <summary>
/// Example endpoint to authenticate a user and retrieve a token from the identity server,
/// and redirect the user to the Knowledge Base (KB) using the token code.
/// </summary>
/// <param name="clientId">Client ID issued for your application</param>
/// <param name="clientSecret">Client secret associated with the client ID</param>
/// <returns>Redirects to the KB with the issued code</returns>
[HttpGet]
[Route("authenticate")]
public async Task<IActionResult> AuthenticateAsync(string clientId, string clientSecret)
{
if (!HttpContext.User.Identity.IsAuthenticated)
{
// user is not authenticated, redirect to an error or login page
return Unauthorized(new { message = "User not authenticated" });
}
// Ensure you have the correct client ID and secret from your Document360 JWT configuration
var authToken = Encoding.ASCII.GetBytes($"{clientId}:{clientSecret}");
// Create an HttpClient instance
using var httpClient = new HttpClient();
// Set the Authorization header with Basic authentication
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authToken));
// Prepare the payload with user information
var payload = new
{
username = User.Identity.Name,
firstName = "FirstName", // Replace or customize as needed
lastName = "LastName",
emailId = "user@example.com", // Replace with actual user email
readerGroupIds = new List<string> { "group1", "group2" }, // Replace with actual reader group IDs if needed (Optional)
tokenValidity = 3600 // Token validity in seconds (Optional, default is 5 minutes)
};
var payloadContent = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
// Identity server token endpoint - replace with your actual URL
string identityServerUrl = "codeGeneration endpoint, you can find that in JWT config portal";
// KB login URL to redirect after successful token issuance
string kbLoginUrl = "https://{your subdomain}.document360.io";
var response = await httpClient.PostAsync(identityServerUrl, payloadContent);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var tokenJson = JObject.Parse(content);
// Extract the code from the response
var tokenCode = (string)tokenJson.SelectToken("code");
// Construct the KB login URL with code query parameter
string finalRedirectUrl = $"{kbLoginUrl}?code={tokenCode}";
return Redirect(finalRedirectUrl);
}
else
{
// Handle error response from the identity server
var error = await response.Content.ReadAsStringAsync();
return StatusCode((int)response.StatusCode, new { error = "Token request failed", details = error });
}
}const express = require('express');
const https = require('https');
const axios = require('axios');
const app = express();
// Middleware to parse JSON
app.use(express.json());
// Replace with your actual client ID and secret from Document360
const clientId = 'b20bf794-050c-4194-bc30-bd834c51adad';
const clientSecret = '07U7nXLbOY7-klsmWrOOT3_qHa631XMOuqSd_gl69I8';
const codeGenerationUrl = 'https://identity.document360.net/jwt/generateCode';
// Your D360 KB URL (Replace your-subdomain)
const kbLoginUrl = 'https://jwt-readergroup1-sep.document360.net/jwt/authorize';
// ROUTE: /authenticate
app.get('/authenticate', async (req, res) => {
try {
// Example — add your real auth logic
const isAuthenticated = true;
if (!isAuthenticated) {
return res.status(401).json({ message: 'User not authenticated' });
}
// Basic Authorization header
const authHeader = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
// Payload to send to D360
const payload = {
username: 'john.doe',
firstName: 'John',
lastName: 'Doe',
emailId: 'john.doe@example.com',
readerGroupIds: ['group1', 'group2'],
tokenValidity: 3600
};
// POST to D360 identity server to get the code
const response = await axios.post(
codeGenerateUrl,
payload,
{
headers: {
'Authorization': `Basic ${authHeader}`,
'Content-Type': 'application/json',
'Accept': 'application/json'
},
httpsAgent: new https.Agent({ maxVersion: 'TLSv1.2' })
}
);
const tokenCode = response.data?.code;
if (!tokenCode) {
return res.status(500).json({ message: 'No code received from Document360' });
}
console.log("Redirecting to:", `${kbLoginUrl}?code=${tokenCode}`);
// Redirect user to KB with ?code=<token>
return res.redirect(`${kbLoginUrl}?code=${tokenCode}`);
} catch (error) {
console.error("JWT SSO error:", error.message);
return res.status(500).json({
message: "JWT SSO failed",
details: error.response?.data || error.message
});
}
});import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.nio.charset.StandardCharsets;
import java.util.*;
@RestController
public class JwtSsoController {
private final String clientId = "your-client-id";
private final String clientSecret = "your-client-secret";
private final String codeGenerationUrl = "https://identity.document360.io/api/jwt/generate-code";
private final String kbLoginUrl = "https://your-subdomain.document360.io/jwt/authorize";
@GetMapping("/authenticate")
public ResponseEntity<?> authenticate() {
// Example: Check if user is authenticated in your system
boolean isAuthenticated = true; // Replace with actual logic
if (!isAuthenticated) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("User not authenticated");
}
// Create Basic Auth header
String auth = clientId + ":" + clientSecret;
String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Basic " + encodedAuth);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// Construct payload
Map<String, Object> payload = new HashMap<>();
payload.put("username", "john.doe");
payload.put("firstName", "John");
payload.put("lastName", "Doe");
payload.put("emailId", "john.doe@example.com");
payload.put("readerGroupIds", Arrays.asList("group1", "group2"));
payload.put("tokenValidity", 3600); // Optional
HttpEntity<Map<String, Object>> request = new HttpEntity<>(payload, headers);
RestTemplate restTemplate = new RestTemplate();
try {
ResponseEntity<Map> response = restTemplate.postForEntity(codeGenerationUrl, request, Map.class);
if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {
String tokenCode = (String) response.getBody().get("code");
if (tokenCode == null || tokenCode.isEmpty()) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("No code returned from Document360");
}
// Redirect to the KB site with code
String redirectUrl = UriComponentsBuilder.fromHttpUrl(kbLoginUrl)
.queryParam("code", tokenCode)
.toUriString();
HttpHeaders redirectHeaders = new HttpHeaders();
redirectHeaders.setLocation(java.net.URI.create(redirectUrl));
return new ResponseEntity<>(redirectHeaders, HttpStatus.FOUND); // 302 redirect
} else {
return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
.body("Failed to get code from Document360: " + response.getStatusCode());
}
} catch (Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("JWT SSO error: " + ex.getMessage());
}
}
}Je JWT-configuratie testen
Zodra je de JWT SSO-logica in je backend hebt geïmplementeerd, kun je de integratie testen met een van beide cURL of Postman. Deze tests simuleren hoe je backend communiceert met de Document360-identiteitsserver om een eenmalige autorisatiecode op te halen.
JWT-configuratie testen met cURL
Om de JWT-configuratie te testen, kun je het cURL-commando gebruiken met de volgende specificaties. De HTTP-versie moet worden gespecificeerd (HTTP2 over TLS en versie van SSL naar TLS 1.2. Zonder dit zou de cURL falen.
curl -X POST https://identity.document360.io/api/jwt/generate-code \
-H "Authorization: Basic BASE64_ENCODED_CLIENTID:CLIENTSECRET" \
-H "Content-Type: application/json" \
--http2-prior-knowledge \
--tls-max 1.2 \
-d '{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe",
"emailId": "john.doe@example.com",
"readerGroupIds": ["group1", "group2"],
"tokenValidity": 15
}'
OPMERKING
Vervang de gecodeerde autorisatiestring- en payloadvelden door je daadwerkelijke clientgegevens en gebruikersinformatie van je systeem.
In tegenstelling tot andere beschikbare IdP-opties (Okta, Azure AD, enz.) heeft de gebruiker geen apart lezersaccount nodig op Document360. Een account in de clientapplicatie is voldoende.
Na het inschakelen van de JWT-login kan de lezer via de clientapplicatie inloggen als lezersaccount op de kennisbanksite van Document360.
JWT-configuratie testen met Postman
Je kunt je JWT SSO-configuratie testen met Postman door handmatig een verzoek naar de Code generatie-URL te sturen. Dit stelt je in staat te verifiëren dat je clientgegevens en payload worden geaccepteerd en dat een eenmalige autorisatiecode succesvol is gegenereerd.
Om te testen met Postman, volg deze stappen:
Open Postman en maak een nieuw verzoek aan.
Stel de aanvraagmethode in op POST, en voer in het URL-veld de Code generatie-URL in vanuit het JWT-configuratiescherm:
https://identity.document360.io/api/jwt/generate-codeGa naar het tabblad Autorisatie .
Stel het Type in op
Basic Auth.Voer in het veld Gebruikersnaam je Client ID in.
Voer in het veld Wachtwoord je Client Secret in.
Ga naar het tabblad Lichaam .
Selecteer de raw-optie en stel het formaat in op JSON.
Maak kennis met de vereiste JSON-payload. Voorbeeld:
{ "username": "john.doe", "firstName": "John", "lastName": "Doe", "emailId": "john.doe@example.com", "readerGroupIds": ["group1", "group2"], "tokenValidity": 15 }Klik op Verzenden om het verzoek in te dienen.
Als de configuratie correct is, zou je een 200 OK eenmalige codereactie moeten ontvangen. Je kunt deze code vervolgens gebruiken om de lezer door te leiden naar de kennisbanksite en de SSO-inlogflow te voltooien.
Domeingebaseerde lezerroutering
Wanneer een lezer een domein invoert in het domeinnaamveld op de inlogpagina, vergelijkt Document360 dit met alle actieve JWT-configuraties en stuurt de lezer naar de bijbehorende inlog-URL van de bijbehorende configuratie.
Document360 hanteert een regel voor de meest-specifieke match. Als bijvoorbeeld zowel example.com als support.example.com zijn geconfigureerd, wordt een lezer die binnenkomt support.example.com naar de support.example.com configuratie gestuurd in plaats van naar het ouderdomein. Dit maakt het mogelijk om subdomeinen zonder conflicten door speciale configuraties te beheren.
Aanvullende routeringsregels:
Domeinmatching is niet hoofdlettergevoelig en elke domeinnaam moet uniek zijn.
Als de bijbehorende configuratie inactief is, wordt de lezer naar de standaard inlogopties gestuurd.
Als er geen match wordt gevonden, wordt de lezer doorgestuurd naar de standaard inlogopties.
Het domeinnaamveld is exclusief van toepassing op JWT-routering. SSO-providers zijn niet toegankelijk via dit veld.
JWT en SSO coëxistentie
JWT- en SSO (SAML- of OpenID)-configuraties kunnen gelijktijdig actief zijn in hetzelfde project. Elk type wordt onafhankelijk beheerd — het aanpassen van een JWT-configuratie heeft geen effect op de SSO-configuraties, en omgekeerd. Dit stelt organisaties in staat om lezers van verschillende identiteitssystemen te ondersteunen via één kennisbankportaal zonder conflicten tussen authenticatiemethoden.
Bijvoorbeeld, zakelijke klanten kunnen zich authenticeren via een JWT-gebaseerd systeem dat aan je applicatie is gekoppeld, terwijl interne teamleden zich aanmelden via een gecentraliseerde IdP zoals Okta met SAML. Beide methoden kunnen tegelijkertijd actief zijn zonder interferentie.
Limieten voor inlogknopen
Authenticatietype | Maximaal weergegeven inlogknoppen | Toegang voorbij de limiet |
|---|---|---|
JWT | 3 | De eerste 3 JWT-configuraties worden weergegeven als aanmeldknoppen op basis van hun CTA-positievolgorde. Als je meer dan 3 JWT-providers configureert, kunnen lezers authenticeren met het domeinnaamveld, dat hen naar de juiste configuratie stuurt. Je kunt in totaal maximaal 5 JWT-providers configureren. |
SSO | 5 | Alleen de eerste 5 SSO-aanbieders (volgens CTA-positievolgorde) worden weergegeven. SSO-aanbieders boven deze limiet zijn op geen enkele manier toegankelijk voor lezers. |
Als bijvoorbeeld 5 JWT-configuraties actief zijn, verschijnen er 3 als inlogknoppen en zijn de resterende 2 alleen toegankelijk via domeininvoer. Als 6 SSO-configuraties actief zijn, zijn er slechts 5 toegankelijk — de 6e is niet bereikbaar voor lezers.
De JWT-limiet (3) en de SSO-limiet (5) worden onafhankelijk van elkaar toegepast. Het bereiken van de ene limiet heeft geen effect op de andere.
Wanneer de limiet van 3 knoppen voor JWT is bereikt, ontvangen alle projectbeheerders een systeemmelding: "Je hebt de limiet van 3 JWT-inlogknoppen bereikt. Extra JWT-configuraties verschijnen niet als knoppen op de inlogpagina. Lezers kunnen zich nog steeds aanmelden door hun domeinnaam in te voeren."
Op de inlogpagina van de lezer staat
De inlogpagina die aan lezers wordt getoond, wordt bepaald door twee factoren: de status van de schakelaar voor de standaard inlogpagina Uitschakelen , en welke JWT- en SSO-configuraties momenteel actief zijn.
Staat | Toggle | JWT actief | SSO actief | Lezerservaring |
|---|---|---|---|---|
1 | OFF | Nee | Ja | Standaard e-mail/wachtwoordformulier met SSO-inlogknoppen |
2 | OFF | Ja | Ja | Standaard e-mail/wachtwoordformulier met SSO- en JWT-inlogknoppen |
3 | OFF | Ja | Nee | Standaard e-mail/wachtwoordformulier met JWT-inlogknoppen |
4 | OP | Nee | Ja | Alleen SSO-inlogknoppen — geen e-mail/wachtwoordformulier |
5 | OP | Ja | Nee | Domeinnaaminvoerveld met JWT-inlogknoppen — geen e-mail/wachtwoordformulier |
6 | OP | Ja | Ja | Domeinnaaminvoerveld met JWT-inlogknoppen en SSO — geen e-mail/wachtwoordformulier |
Toepasselijke regels:
Alleen actieve configuraties worden weergegeven. Inactieve configuraties worden nooit aan lezers getoond, ongeacht de toggle status.
Het invoerveld voor domeinnaam wordt weergegeven wanneer de schakelaar AAN staat en minstens één JWT-configuratie actief is. Dit zorgt ervoor dat JWT-configuraties zonder zichtbare inlogknop bereikbaar blijven via domeininvoer.
Als alle JWT- en SSO-configuraties inactief zijn terwijl de schakelaar AAN staat, krijgen lezers een bericht te zien dat er momenteel geen inlogopties beschikbaar zijn.
Wijzigingen om de status of configuratiestatus te wisselen gaan direct in voor nieuwe lezersessies. Bestaande geauthenticeerde sessies worden niet beïnvloed.
Auditlogging en meldingen
Alle JWT-configuratieacties worden automatisch vastgelegd in het auditlogboek. Dit biedt een volledig en manipulatievrij overzicht van wijzigingen voor compliance- en beveiligingsbeoordelingsdoeleinden.
Gelogde acties:
Aanmaken, Bijwerken, Verwijderen
Inschakelen, uitschakelen
Regenereer Primaire Token, Regenereer Secundaire Token
Directe JWT-login inschakelen/uitschakelen
Schakel de standaard inlogpagina in/uit
Elke logboekvermelding registreert het actietype, tijdstempel (UTC), de identiteit van de beheerder die de actie uitvoerde, en de configuratienaam op het moment van de actie. Voor updateacties bevat het logboek de specifieke velden die zijn veranderd, samen met de vorige en nieuwe waarden. Tokenwaarden worden nooit geregistreerd — alleen het feit van rotatie wordt geregistreerd om de beveiliging van de inloggegevens te beschermen.
Logs worden minimaal 90 dagen bewaard. Toegang tot JWT-auditlogboeken is beperkt tot gebruikers met Security & Audit-rechten.
Om JWT-activiteitstracking in Team Auditing in te schakelen, navigeer naar Instellingen > Beveiliging & Audit > Teamauditing > Auditconfiguratie en schakel de relevante JWT-gebeurtenisschakelaars in. Eenmaal ingeschakeld wordt JWT-activiteit geregistreerd in het tabblad Teamauditing . Gebruik het dropdown Event en zoek op "JWT" om records te filteren op eventtype.
Ontvangers van e-mailmeldingen:
Gebeurtenistype | Ontvangers |
|---|---|
Alle JWT-configuratiegebeurtenissen | Projectbeheerders |
Geheime tokenregeneratie | Projectbeheerders en projecteigenaren |
Doorverwijzing naar andere pagina's in plaats van de startpagina
Standaard worden gebruikers na het inloggen doorgestuurd naar de startpagina van je kennisbank.
Als je startpagina niet is gepubliceerd, worden gebruikers doorgestuurd naar de /docs-pagina .
Om gebruikers door te leiden naar een andere pagina in je kennisbank (anders dan de Home - of /docs-pagina 's), configureer je de doorleiding tijdens de JWT-installatie met de volgende code.
URL-patroon
https://<Knowledge base URL>/jwt/authorize?code=<code>&redirectUrl=<redirect path>Parameters
<Knowledge base URL>: De hoofd-URL van je knowledge base-site.
<Code>: De code die wordt gegenereerd door het Document360-codegeneratie-eindpunt.
<omleidingspad>: De nieuwe URL waar je wilt dat gebruikers landen na het inloggen.
Voorbeeld
https://example.document360.io/jwt/authorize?code=FOTaS_SW6dLGytQXvrG_rRFGhyPvrDDrgxJAZzYvJcY&redirectUrl=/docs/5-basic-things-to-get-started
OPMERKING
Document360 zal de Redirectie-URL
redirectPathnaar het inlog-eindpunt sturen. Wanneer het inlog-eindpunt met de authenticatiecode terugstuurt naar de kennisbank, zou het de Redirectie-URL als parameterredirectUrlmoeten teruggeven.In KB Site 2.0 wordt de omleiding afgehandeld met behulp van cookies in plaats van de
redirectUrlparameter. Als je JWT-implementatie gebaseerd is op het omleiden van querystrings (met behulp van deredirectUrlparameter), houd dan rekening met dat de cookie-gebaseerde aanpak deze parameter niet ondersteunt. Je moet mogelijk je implementatie bijwerken of contact opnemen met de support voor verdere verduidelijking.
Probleemoplossing
Als je problemen ondervindt tijdens de JWT SSO-installatie, raadpleeg dan de volgende veelvoorkomende fouten en hun oplossingen:
401-ongeautoriseerde fout bij het testen van JWT in Postman
Fout: 401 Ongeautoriseerde fout
Als je een 401 Unauthorized fout tegenkomt tijdens het testen van JWT (JSON Web Token) met Postman, gebeurt dit meestal omdat de autorisatie-instellingen niet correct zijn geconfigureerd.
Stappen om op te lossen:
Om deze fout op te lossen,
Open in Postman het verzoek dat je aan het testen bent.
Ga naar het tabblad Autorisatie .
Stel het autorisatietype in op Basic Auth.
Voer in het veld Gebruikersnaam het Client-ID in.
Voer in het veld Wachtwoord het Client Secret in.
Ga naar het tabblad Lichaam .
Selecteer de raw-optie in het dropdown en zorg ervoor dat het formaat op JSON is ingesteld.
Voeg de benodigde JSON-payload toe voor het API-verzoek.
Klik op Verzenden om het verzoek uit te voeren.
Controleer de reactie voor de verwachte resultaten. Als het verzoek succesvol is, zou je een authenticatiecode of token in het antwoord moeten ontvangen.
FAQ
Als een geconfigureerde JWT-gebruiker uitlogt bij de clientapplicatie, betekent dat dan dat hij ook uit Document360 wordt uitgelogd?
Nee, de sessie op Document360 is onafhankelijk na de eerste Single Sign-On. Gebruikers kunnen Document360 blijven gebruiken totdat de geldigheid van het token verloopt, zelfs nadat ze zijn uitgelogd bij de clientapplicatie.
Voorbeeld: Als de geldigheid van de token is ingesteld op 1 dag, blijft de Document360-sessie actief totdat de token verloopt. Zodra dat gebeurt, wordt de gebruiker uitgelogd.
Kan ik een waarde geven die de toegestane tokengeldigheidsband overschrijdt?
Nee, als er een waarde buiten het bereik wordt opgegeven, zal het systeem automatisch de dichtstbijzijnde toegestane waarde toewijzen:
5 minuten voor waarden onder het minimum.
1440 minuten voor waarden boven het maximum.
Wat is het verschil tussen JWT en SSO?
Je kunt een vergelijking tussen JWT (JSON Web Token) en SSO (Single Sign-On) bekijken in de onderstaande tabel:
Categorie | JWT (JSON Web Token) | SSO (Single Sign-On) |
Authenticatie | Tokens die per sessie/gebruikersverzoek worden gegenereerd. | Gecentraliseerde authenticatie over apps heen. |
Tokenverloop | Tokens verlopen meestal na een bepaalde periode. | Geen token, sessie wordt afgehandeld door de identiteitsprovider. |
Beveiliging | Vereist veilige tokenopslag. | Veiligere, meer gecentraliseerde opslag van inloggegevens. |
Gebruik | Gebruikt voor stateloze, eenmalige authenticatie. | Gebruikt voor meerdere applicaties met één enkele login. |
Integratie | Makkelijker te implementeren in aangepaste apps. | Vereist integratie met een identiteitsprovider. |
Kunnen JWT en SSO (SAML of OpenID) tegelijkertijd actief zijn?
Ja. JWT- en SSO-configuraties kunnen zonder conflict in hetzelfde project naast elkaar bestaan. Elk type wordt onafhankelijk beheerd, wijzigingen aan het ene hebben geen invloed op het andere.
Wat moet er gebeuren als geheime tokens verloren gaan?
Geheime tokens worden slechts één keer weergegeven bij het maken van de configuratie. Als je het kwijt bent, ga dan naar de configuratiemodus Bewerken en klik op Regenereren voor het relevante token. Regeneratie maakt het bestaande token onmiddellijk ongeldig. De applicatie moet zonder vertraging worden bijgewerkt met de nieuwe token om authenticatiefouten te voorkomen.
Zal onze JWT-setup of gebruikerstoegang veranderen na het migreren naar de KB-site 2.0?
Nee. Wanneer je migreert naar KB-site 2.0, zijn er geen wijzigingen aan je huidige JWT-configuratie, lezertoegang of interne gebruikers. Een toegewijd migratieteam ondersteunt je tijdens het proces en zorgt ervoor dat je bestaande aanpassingen en instellingen intact blijven na je beoordeling.