Skip to content

Conversation

@imdominicreed
Copy link
Contributor

Move client_id setting from generic request setup to auth-method-specific handlers. This ensures client_id is only included when using client assertion authentication, not for all request types.

Proposed Changes

Checklist

  • I have added or updated unit tests
  • I have added or updated integration tests (if appropriate)
  • I have added or updated documentation

Testing Instructions

Move client_id setting from generic request setup to auth-method-specific handlers. This ensures client_id is only included when using client assertion authentication, not for all request types.
@imdominicreed imdominicreed requested review from a team as code owners December 19, 2025 22:21
@github-actions github-actions bot added comp:sdk A software development kit, including library, for client applications and inter-service communicati size/xs labels Dec 19, 2025
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @imdominicreed, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request refactors the handling of the client_id parameter within OAuth requests. The change ensures that client_id is only included in the request form data when it is relevant to the specific authentication method being used, primarily for client assertion authentication. This prevents its unnecessary inclusion in other grant types, aligning the implementation more closely with OAuth specifications and improving the precision of authentication flows.

Highlights

  • Conditional Client ID Setting: The client_id parameter is now set conditionally based on the OAuth authentication method, ensuring it is only included in requests when specifically required, such as for client assertion authentication.
  • Client Credentials Grant Type: The client_id is no longer automatically included in the form data for requests using the client_credentials grant type.
  • Password Grant Type (Certificate Exchange): The client_id has been removed from the initial form data setup for requests related to certificate exchange using the password grant type.
  • Client Assertion Authentication: The client_id is now explicitly added to the form data when the authentication method is ClientAuthTypeClientAssertion.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.


Client ID now waits, Only when assertion calls, Auth flow is precise.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request correctly refactors the OAuth client authentication logic to conditionally include the client_id parameter based on the authentication method. The changes ensure client_id is only sent in the request body for client assertion authentication, which aligns with OAuth 2.0 standards.

While the changes for the client_credentials grant in getAccessTokenRequest are implemented correctly, the modification in getCertExchangeRequest exposes a latent critical bug. The request body is constructed before the client authentication parameters are added, which will cause authentication to fail when using client assertions. I've provided a detailed comment with a suggested fix. Please note that getTokenExchangeRequest suffers from the same issue and should also be corrected.


func getCertExchangeRequest(ctx context.Context, tokenEndpoint string, clientCredentials ClientCredentials, exchangeInfo CertExchangeInfo, key jwk.Key) (*http.Request, error) {
data := url.Values{"grant_type": {"password"}, "client_id": {clientCredentials.ClientID}, "username": {""}, "password": {""}}
data := url.Values{"grant_type": {"password"}, "username": {""}, "password": {""}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

While removing the unconditional client_id here is correct, it reveals a critical logic bug in this function's order of operations.

The request body is created from data on line 342, but setClientAuth—which should conditionally add client_id for client assertion authentication—is called on line 355, after the body has been created. This means any modifications setClientAuth makes to the data map will not be included in the request body, breaking client assertion authentication.

To fix this, this function should be refactored to follow the pattern in getAccessTokenRequest:

  1. Create the http.Request with a nil body.
  2. Call setClientAuth to populate headers and/or the url.Values map.
  3. Encode the url.Values and set the req.Body.

A similar bug also exists in getTokenExchangeRequest and should be addressed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp:sdk A software development kit, including library, for client applications and inter-service communicati size/xs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant