docs: document six openid-connect config keys the app supports - #41846
Merged
Merged
Conversation
The admin manual's parameter reference is generated from this file by owncloud/config-to-docs, so a key missing here is missing from the documentation - and a key documented only in the docs repo is deleted by the next regeneration. These six the openidconnect app reads and this file did not mention: - audience - the expected access token audience. Available from app version 2.4.2; the audience check itself shipped in 2.4.1, where the client-id had to appear in "aud" with no way to override it, which is why providers that name the resource there - Keycloak, ADFS, Entra ID with v1.0 tokens - could not authenticate with JWT access tokens on that version. See owncloud/openidconnect#373 and #374. - exchange-token-mode-before-introspection - RFC 8693 token exchange before introspection, with the value selecting the subject token type (lib/Client.php). - use-access-token-introspection-for-user-info - read user information from the introspection response rather than the userinfo endpoint (lib/Client.php). - ocis-routing-policy-claim, ocis-routing-policy-cookie and ocis-routing-policy-cookie-directives - the claim, cookie name and cookie directives used to route users between Classic and Infinite Scale behind a proxy (lib/Controller/LoginFlowController.php). Defaults as in the code: ocis.routing.policy, owncloud-selector and "path=/;". Every auto-provision subkey is already covered by the code samples further down, so this only adds top-level keys, in the existing alphabetical order and style. Two details the app's behaviour makes worth stating, both checked against the code rather than assumed: 'audience' => null behaves as if the key were absent (isset()), while any other unusable value is dropped and fails closed; and the exchange subject comes from the login session while a session is verified but is the presented token when user information is read, which is why the entry distinguishes the two paths. The use-access-token-payload-for-user-info entry gains one clause, because its "if false, the userinfo endpoint is used" is no longer the whole story once the introspection variant is documented. The doc link is version-explicit rather than following this file's /server/latest/ convention: latest is a redirect stub that drops the URL fragment and always points at the newest server line, so a deep link into a version-scoped section needs the real path.A second review round tightened three things further: the ID-token consequence of setting the key holds only where the configured value differs from the client-id, so it is stated conditionally rather than flat; a missing OIDC session makes the token exchange fail with an empty subject rather than skipping it, and on the user-info path the subject is the client's current token; and the sentence explaining that an ADFS relying-party identifier is often the same GUID as the client-id but is not the client is restored, since misreading exactly that produced issue owncloud/openidconnect#373. Note for reviewers: the "+" lines inside the audience entry are AsciiDoc paragraph continuations, required because this file's comments are published verbatim as the manual's parameter reference. No other entry needs them because no other entry runs to several paragraphs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Thomas Müller <323649642+oc-tmueller@users.noreply.github.com>
This was referenced Sep 21, 2026
Contributor
Author
|
Note on the red so the
A re-run should clear it. |
phil-davis
approved these changes
Sep 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The admin manual's OIDC parameter reference is generated from this file by owncloud/config-to-docs, so a key that is missing here is missing from the documentation — and a key documented only in the docs repo is deleted by the next regeneration. Six keys the
openidconnectapp reads were missing:audiencelib/Client.phpexchange-token-mode-before-introspectionlib/Client.phpuse-access-token-introspection-for-user-infolib/Client.phpocis-routing-policy-claimlib/Controller/LoginFlowController.phpocis.routing.policyocis-routing-policy-cookieowncloud-selectorocis-routing-policy-cookie-directivespath=/;Every auto-provision subkey is already covered by the code samples further down (
enabled,email-claim,display-name-claim,picture-claim,groups,provisioning-claim,provisioning-attribute,update), and theprovider-paramsdiscovery endpoints likewise — so this adds top-level keys only, in the existing alphabetical order and comment style.Why the
audienceentry is longIt is the one key here whose misconfiguration locks every user out, and the release history needs saying: the audience check shipped in app version 2.4.1 requiring the
client-idinaudwith no override, so a provider that names the resource there — Keycloak, ADFS, Entra ID issuing v1.0 tokens — could not authenticate at all with JWT access tokens. 2.4.2 adds this key plus acceptance ofazp/appid/client_id. The entry says which is which, because an admin reading it may be on either.Details checked against the app code rather than assumed
'audience' => nullbehaves as if the key were absent (isset()), while any other unusable value is dropped and fails closed. The entry distinguishes them; they are not equivalent.verifyAudience()call sits in the JWT branch — so the lockout claim is scoped to JWT access tokens. 2.4.2 checks both paths.audiencealso keeps ID tokens out, but only where the value differs from theclient-id, since an ID token'saudis theclient-id.use-access-token-payload-for-user-infogains one clause: its "iffalse, the userinfo endpoint is used" is no longer the whole story once the introspection variant is documented, and it wins only for a JWT — an opaque token has no payload to read.Two things a reviewer might flag
+lines inside theaudienceentry are AsciiDoc paragraph continuations. They are required because this file's comments are published verbatim; no other entry needs them because no other entry runs to several paragraphs./server/11.0/…) rather than this file's usual/server/latest/.latestcannot carry a deep link into a version-scoped section: it resolves to a 673-byte stub that redirects to the newest line without the fragment, and for the 10.16 counterpart it would send the reader into the wrong manual entirely. The trade-off is that this URL will point at the 11.0 manual once master becomes 11.1.Testing
Comment-only change, no code paths touched. Verified end to end that the generator reproduces the manual page from this file: before the change, running config-to-docs against
origin/masterproduced the committed page byte-identically (zero drift), and after it the diff is exactly these entries. owncloud/docs.owncloud.com#137 carries that regenerated output. No changelog entry, following the otherdocs:commits to this file.🤖 Generated with Claude Code