['client_credentials','Client Credentials (Dienst zu Dienst)'],
['device_code','Device Code (CLI, Geräte ohne Browser)']];
functionloadOAuthClients(){
currentView=loadOAuthClients;
setActiveNav('nav-oauth');
loadDomainSelector(function(){
if (needRealDomain('OAuth-Clients'))return;
ajaxGet(dirApi("oauthlist"),function(err,data){
if (err){showError(dirErr(err));return;}
g_oauthClients=data.clients||[];
g_oauthIssuer=data.issuer||'';
varh='<h3>OAuth / OpenID Connect</h3>';
h+='<p class="hint">Anwendungen melden Benutzer per OpenID Connect gegen das Verzeichnis an. Issuer: <code>'+escapeHtml(g_oauthIssuer)+'</code><br>Discovery: <code>'+escapeHtml(g_oauthIssuer)+'/.well-known/openid-configuration</code></p>';
h+='<tr><td><label>Redirect-URIs</label></td><td><textarea name="redirect_uris" rows="3" cols="50" placeholder="https://app.example.com/oauth/callback">'+escapeHtml(c.redirect_uris.join('\n'))+'</textarea><br><span class="hint">eine pro Zeile, exakt so wie die Anwendung sie sendet</span></td></tr>';
| 9 | Packaging for FenrirOS (spec, syslite unit, container), admin UI for AD objects/DNS/LDIF | |
| 10 | OAuth 2.0 / OpenID Connect provider (plugin oidc) | Issuer per domain <base>/<domain>; discovery, JWKS (RS256), authorize (code + PKCE S256, login page, SSO cookie, prompt=none/login), token (authorization_code, refresh_token with rotation, client_credentials, device_code), device verification page, userinfo, introspection, revocation, end-session; clients with group restriction managed in the admin UI; state in OAuthObject records (replicated, not visible over LDAP/SMB); tested end to end with Authlib |