[SAP IAS] Fix thread-safety race condition in PKCE handling

The previous implementation used a shared AuthorizationUrlBuilder field
in the SAPIasOAuthService singleton. Calling initPKCE() on this shared
builder meant that concurrent login requests from different users would
overwrite the code_verifier, leading to intermittent authentication
failures.

Use the new OAuthAuthorizationInfo extension point to generate and
return a per-request code_verifier. This allows Gerrit to store the
verifier in the user's session and pass it back to the
getAccessToken(OAuthVerifier, String) method, ensuring the verifier
matches the original challenge for each specific login flow.

The single-argument getAccessToken(OAuthVerifier) and
getAuthorizationUrl() methods are removed as they are now provided by
default implementations in the OAuthServiceProvider interface.

Add SAPIasOAuthServiceTest to verify the PKCE flow and ensure that the
code verifier is correctly extracted from the session and passed to the
underlying ScribeJava service.

Depends-On: https://gerrit-review.googlesource.com/c/gerrit/+/564343
Change-Id: I718ec9d72da1c13ca4ac405563a8d4c4a5636b8e
3 files changed
tree: e0a2cad3e67f0e9e24a0a51cf2b72d1d0f1a0380
  1. .settings/
  2. src/
  3. tools/
  4. .bazelignore
  5. .bazelrc
  6. .bazelversion
  7. .gitignore
  8. .travis.yml
  9. BUILD
  10. external_plugin_deps.MODULE.bazel
  11. LICENSE
  12. LICENSE-scribe
  13. MODULE.bazel
  14. MODULE.bazel.lock
  15. oauth_plugin_deps.lock.json
  16. oauth_third_party_runtime_jars.allowlist.txt
  17. README.md
README.md

Gerrit OAuth2 authentication provider

Build Status

With this plugin Gerrit can use OAuth2 protocol for authentication. Supported OAuth providers:

See the Wiki what it can do for you.

Prebuilt artifacts

Prebuilt binary artifacts are available on release page. Make sure to pick the right JAR for your Gerrit version.

Build

To build the plugin with Bazel, install Bazel and run the following:

  git clone https://gerrit.googlesource.com/plugins/oauth
  cd oauth && bazel build oauth

Install

Copy the bazel-bin/oauth.jar to $gerrit_site/plugins and re-run init to configure it:

  java -jar gerrit.war init -d <site>
  [...]
  *** OAuth Authentication Provider
  ***
  Use Bitbucket OAuth provider for Gerrit login ? [Y/n]? n
  Use Google OAuth provider for Gerrit login ? [Y/n]?
  Application client id          : <client-id>
  Application client secret      : 
                confirm password : 
  Link to OpenID accounts? [true]: 
  Use GitHub OAuth provider for Gerrit login ? [Y/n]? n

Reporting bugs

Make sure to read the FAQ before reporting issues.

License

Apache License 2.0