{
    "componentChunkName": "component---src-templates-plugin-releases-tsx",
    "path": "/plugins/scm-oauth2-plugin/releases",
    "result": {"data":{"plugin":{"name":"scm-oauth2-plugin","displayName":"OAuth2/OIDC","description":"Authentication for SCM-Manager using OAuth2/OIDC"},"releases":{"nodes":[{"tag":"1.0.3","date":"2026-09-14 08:09","url":"https://packages.scm-manager.org/repository/plugin-releases/sonia/scm/plugins/scm-oauth2-plugin/1.0.3/scm-oauth2-plugin-1.0.3.smp","checksum":"5ea297c456f6572e8fa3b0995d0d37065e943174d809a0ab6eaa92ca7b5d89ea","conditions":{"minVersion":"3.9.0"}}]},"changelog":{"versions":[{"tag":"1.0.3","changes":{"html":"<h3>Changed</h3>\n<ul>\n<li>Release in official SCM-Manager plugin center</li>\n</ul>"}},{"tag":"1.0.2","changes":{"html":"<h3>Security</h3>\n<ul>\n<li><strong>Signature verification of the id token</strong> (OIDC Core 3.1.3.7): the signature is checked against the JSON Web Key Set of the identity provider (<code>RS</code>/<code>PS</code>/<code>ES</code> families) or against the client secret (<code>HS</code> family), together with <code>iss</code>, <code>aud</code>/<code>azp</code>, <code>exp</code>/<code>nbf</code>/<code>iat</code> (60 s clock skew) and the nonce of the login. An id token which is present but invalid aborts the login. <code>alg: none</code> and unknown algorithms are rejected, and the algorithm determines the accepted key type, which rules out algorithm confusion; a <code>crit</code> header is rejected as well. New classes <code>TokenVerifier</code>, <code>Jws</code>, <code>JwsAlgorithm</code>, <code>JwksClient</code>, <code>JwksProvider</code>, <code>JsonWebKeys</code> — implemented with the crypto primitives of the JDK, so the plugin still has no runtime dependencies of its own.</li>\n<li><strong>Nonce per login</strong>: a fresh nonce is sent with every authorization request and checked in the id token, which binds the token to that very login and makes the replay of a foreign id token useless.</li>\n<li><strong>Roles are only imported from a verified access token.</strong> Signature, issuer and lifetime are checked; an opaque token, an invalid signature or a missing key set now means no roles instead of roles from unverified data. An anomaly of the access token costs the roles, not the login.</li>\n<li><strong>Nothing unverified is used anymore</strong>: an id token which cannot be verified is not stored either, so the sso logout then works without <code>id_token_hint</code>. The principal of the logout is taken from the access token cookie through the <code>AccessTokenResolver</code> of the core (signature and expiry checked) instead of parsing the token payload unverified; the helper <code>JwtPayload</code> is gone.</li>\n<li>New configuration field <code>jwksUrl</code> for manually configured endpoints; with a discovery url the key set url and the issuer come from the document (<code>jwks_uri</code>, <code>issuer</code>).</li>\n<li>The mail claim is no longer written to the log: if it is not a valid mail address, the message names the user id and the length of the value instead of the address itself (finding B-02 of the compliance report).</li>\n</ul>\n<h3>Added</h3>\n<ul>\n<li>German translation of the documentation in <a href=\"README_de.md\">README_de.md</a>, cross linked with the English <a href=\"README.md\">README.md</a>.</li>\n<li>Package overview <code>de/l9g/scm/oauth2/plugin/package-info.java</code> describing the complete login, group synchronization and logout flow, the class map and the extension points used, as entry point for new developers.</li>\n<li>Class, method and field level javadoc for the whole backend, comments for the react components and a short description of the scenario covered by every test class.</li>\n<li>Build switch <code>-Pstage=release</code>: the generated api documentation is written to <code>docs/javadoc</code> next to the sources instead of into the build directory, so it can be committed with the release (<code>./gradlew javadoc -Pstage=release</code>, or as part of <code>./gradlew build -Pstage=release</code>). The directory is emptied before it is regenerated.</li>\n<li>Compliance documentation in German below <code>docs/</code>, derived from the source code: <code>PROZESS_BESCHREIBUNG.md</code> (processing operations, data categories, storage locations and retention, recipients — basis for a record of processing activities under art. 30 GDPR), <code>COMPLIANCE_BERICHT.md</code> (assessment against GDPR and the NIS2 risk management measures of art. 21(2), with 19 implemented technical measures, 2 open findings and 3 documented residual risks), <code>DATENSCHUTZ_FOLGEABSCHAETZUNG.md</code> (threshold analysis and voluntary data protection impact assessment under art. 35 GDPR with 11 assessed risks) and <code>SOURCECODE_STATISTIK.md</code> (size, test coverage, documentation ratio and dependencies, with reproducible measurement commands).</li>\n</ul>\n<h3>Changed</h3>\n<ul>\n<li>Plugin metadata: <code>author</code> is now <code>Thorsten Ludewig</code>.</li>\n</ul>"}},{"tag":"1.0.1","changes":{"html":"<p>First released version. Authentication for SCM-Manager against an OAuth2/OIDC identity provider (developed and tested against Keycloak).</p>\n<h3>Added</h3>\n<ul>\n<li><strong>Authorization code flow</strong> with PKCE (S256, RFC 7636): login endpoint <code>/api/v2/oauth2/auth</code>, callback endpoint <code>/api/v2/oauth2/auth/callback</code>, <code>OAuth2Realm</code> as shiro realm and an access token cookie issued by the core.</li>\n<li><strong>CSRF protection</strong>: single use <code>state</code> values with a ten minute lifetime, additionally bound to the browser which started the flow through the <code>X-SCM-OAuth2-State</code> cookie (RFC 9700, section 4.7); the number of pending authorization requests is capped.</li>\n<li><strong>OIDC discovery</strong>: all endpoints can be resolved from <code>.well-known/openid-configuration</code> (cached for one hour, invalidated when the discovery url changes); manual configuration of the single endpoints stays possible.</li>\n<li><strong>User provisioning</strong>: username, display name and mail address are taken from the configurable userinfo claims; users are stored as external users.</li>\n<li><strong>Migration of existing users</strong>: accounts which already exist under the same name (for example from a previous ldap authentication) are taken over including their permissions, repository ownership and api keys; attributes the identity provider does not deliver keep their stored value. Accounts which still have a local password are only taken over if <code>migrateLocalUsers</code> is enabled.</li>\n<li><strong>Group synchronization</strong>: groups from the group claim are created if missing, memberships are added and revoked on every login, empty groups are never deleted and external groups are left untouched. Names which are invalid for SCM-Manager (for example a keycloak full group path <code>/developers</code>) are sanitized by replacing the invalid characters with <code>_</code>.</li>\n<li><strong>Realm roles from the access token</strong>: optional import of roles from a configurable json path inside the access token (default <code>realm_access.roles</code>), for providers which do not expose roles through the userinfo endpoint.</li>\n<li><strong>Global administrator by group</strong>: if the configured admin group (default <code>scmadmin</code>) is part of the claim, the global <code>*</code> permission is assigned on login and revoked again when the group is gone.</li>\n<li><strong>Forced single sign on</strong>: optional filter which redirects unauthenticated browser requests to the identity provider (<code>forceLogin</code>).</li>\n<li><strong>RP-initiated logout</strong>: optional termination of the SSO session at the identity provider (<code>ssoLogout</code>), passing <code>id_token_hint</code> and <code>post_logout_redirect_uri</code> so the provider does not ask for confirmation and returns to SCM-Manager afterwards.</li>\n<li><strong>Administration ui</strong>: configuration page with provider name, endpoints, client credentials, claim mapping and the feature flags; the client secret is write only and stored encrypted.</li>\n<li><strong>Login ui</strong>: \"Login with &#x3C;provider name>\" button on the login page and in the primary navigation.</li>\n<li>REST configuration endpoint <code>/api/v2/oauth2/configuration</code> (permission <code>configuration:read,write:oauth2</code>) including OpenAPI documentation.</li>\n<li>Documentation in <a href=\"README.md\">README.md</a> with a complete Keycloak setup walkthrough and the sample client export <code>scm-server.json</code>.</li>\n</ul>"}}]},"alerts":{"nodes":[]}},"pageContext":{"name":"scm-oauth2-plugin"}},
    "staticQueryHashes": ["1973669194","2742214048","2956773653"]}