docs: document six openid-connect config keys the app supports [10.16] - #41847
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.3.5, which is also the release that introduces the audience check on this server line, so both halves arrive together. The one shape that upgrade can lock out is an introspection response carrying neither "aud" nor "client_id", which RFC 7662 permits. See owncloud/openidconnect#373 and #368. - 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 resolves to the newest server line, which would send a 10.16 reader into the 11.0 manual whose guidance for this key is different. Text is identical to the master commit except the audience version paragraph and this file's own pre-existing wording in the entry that gained the clause.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
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. On this server line the audience check and the override arrive together, in app version 2.3.5 — every released version up to and including 2.3.4 does not check the audience at all — so the upgrade needs no configuration change for a provider whose tokens name ownCloud in
audor in a client claim. The one shape it can lock out is an introspection response carrying neitheraudnorclient_id, which RFC 7662 permits and which noaudiencevalue can rescue; the entry says so. (On ownCloud 11 the two halves shipped one release apart, 2.4.1 and 2.4.2, which is why that manual's guidance differs.)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.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/10.16/…) 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 if this line ever moves past 10.16.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/10.16produced 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 for the 10.16 tree. No changelog entry, following the otherdocs:commits to this file.🤖 Generated with Claude Code
Text is identical to the counterpart against
master(#41846) except theaudienceversion paragraph, the doc link's version, and this file's own pre-existing wording in the entry that gained a clause.