Skip to content

feat(oidc): optimize the userinfo endpoint - #7706

Merged
muhlemmer merged 11 commits into
mainfrom
perf-userinfo
Apr 9, 2024
Merged

muhlemmer merged 11 commits into
mainfrom
perf-userinfo

Conversation

@muhlemmer

@muhlemmer muhlemmer commented Apr 4, 2024 •

Copy link
Copy Markdown
Collaborator

Optimize the userinfo endpoint by reducing the amount of database queries.
Mostly reuses optimizations introduced by #6909. The legacy and trigger feature flags are also shared.

During implementation I found that the optimized introspection (and the new userinfo code from this PR) would always return the project roles, even if project_role_assertion was set to false. This is now fixed, however it seems that with v2 tokens with legacy userinfo & introspection never returned project roles if this setting was true. This bug was likely introduced with the v2 token implementation here:

scopes, err := o.assertProjectRoleScopes(ctx, applicationID, req.GetScopes())
if err != nil {
return "", "", time.Time{}, zerrors.ThrowPreconditionFailed(err, "OIDC-Df2fq", "Errors.Internal")
}

This issue and how to handle should be discussed in review.

Closes #6910

Definition of Ready

  • I am happy with the code
  • Short description of the feature/issue is added in the pr description
  • PR is linked to the corresponding user story
  • Acceptance criteria are met
  • All open todos and follow ups are defined in a new ticket and justified
  • Deviations from the acceptance criteria and design are agreed with the PO and documented.
  • No debug or dead code
  • My code has no repetitions
  • Critical parts are tested automatically
  • Where possible E2E tests are implemented
  • Documentation/examples are up-to-date
  • All non-functional requirements are met
  • Functionality of the acceptance criteria is checked manually on the dev system.

@vercel

vercel Bot commented Apr 4, 2024 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
docs ✅ Ready (Inspect) Visit Preview 💬 Add feedback Apr 9, 2024 11:36am

@muhlemmer
muhlemmer marked this pull request as ready for review April 8, 2024 13:35
@muhlemmer
muhlemmer requested a review from livio-a April 8, 2024 13:36
Comment thread internal/api/oidc/userinfo.go Outdated
@muhlemmer
muhlemmer merged commit 6a51c4b into main Apr 9, 2024
@muhlemmer
muhlemmer deleted the perf-userinfo branch April 9, 2024 13:15
muhlemmer added a commit that referenced this pull request Apr 14, 2024
When tokens were obtained using the client credentials grant,
with audience and role scopes, userinfo would not return the role claims. This had multiple causes:

1. There is no auth request flow, so for legacy userinfo project data was never attached to the token
2. For optimized userinfo, there is no client ID that maps to an application. The client ID for client credentials is the machine user's name. There we can't obtain a project ID. When the project ID remained empty, we always ignored the roleAudience.

This PR fixes situation 2, by always taking the roleAudience into account, even when the projectID is empty. The code responsible for the bug is also refactored to be more readable and understandable, including additional godoc.

The fix only applies to the optimized userinfo code introduced in #7706 and released in v2.50 (currently in RC). Therefore it can't be back-ported to earlier versions.

Fixes #6662
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 2.50.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

livio-a added a commit that referenced this pull request Apr 16, 2024
* fix(oidc): roles in userinfo for client credentials token

When tokens were obtained using the client credentials grant,
with audience and role scopes, userinfo would not return the role claims. This had multiple causes:

1. There is no auth request flow, so for legacy userinfo project data was never attached to the token
2. For optimized userinfo, there is no client ID that maps to an application. The client ID for client credentials is the machine user's name. There we can't obtain a project ID. When the project ID remained empty, we always ignored the roleAudience.

This PR fixes situation 2, by always taking the roleAudience into account, even when the projectID is empty. The code responsible for the bug is also refactored to be more readable and understandable, including additional godoc.

The fix only applies to the optimized userinfo code introduced in #7706 and released in v2.50 (currently in RC). Therefore it can't be back-ported to earlier versions.

Fixes #6662

* chore(deps): update all go deps (#7764)

This change updates all go modules, including oidc, a major version of go-jose and the go 1.22 release.

* Revert "chore(deps): update all go deps" (#7772)

Revert "chore(deps): update all go deps (#7764)"

This reverts commit 6893e7d.

---------

Co-authored-by: Livio Spring <livio.a@gmail.com>
livio-a added a commit that referenced this pull request Apr 16, 2024
* fix(oidc): roles in userinfo for client credentials token

When tokens were obtained using the client credentials grant,
with audience and role scopes, userinfo would not return the role claims. This had multiple causes:

1. There is no auth request flow, so for legacy userinfo project data was never attached to the token
2. For optimized userinfo, there is no client ID that maps to an application. The client ID for client credentials is the machine user's name. There we can't obtain a project ID. When the project ID remained empty, we always ignored the roleAudience.

This PR fixes situation 2, by always taking the roleAudience into account, even when the projectID is empty. The code responsible for the bug is also refactored to be more readable and understandable, including additional godoc.

The fix only applies to the optimized userinfo code introduced in #7706 and released in v2.50 (currently in RC). Therefore it can't be back-ported to earlier versions.

Fixes #6662

* chore(deps): update all go deps (#7764)

This change updates all go modules, including oidc, a major version of go-jose and the go 1.22 release.

* Revert "chore(deps): update all go deps" (#7772)

Revert "chore(deps): update all go deps (#7764)"

This reverts commit 6893e7d.

---------

Co-authored-by: Livio Spring <livio.a@gmail.com>
(cherry picked from commit 9ccbbe0)
fo-ofc pushed a commit to O-F-C/zitadel that referenced this pull request Jun 10, 2026
* fix(oidc): roles in userinfo for client credentials token

When tokens were obtained using the client credentials grant,
with audience and role scopes, userinfo would not return the role claims. This had multiple causes:

1. There is no auth request flow, so for legacy userinfo project data was never attached to the token
2. For optimized userinfo, there is no client ID that maps to an application. The client ID for client credentials is the machine user's name. There we can't obtain a project ID. When the project ID remained empty, we always ignored the roleAudience.

This PR fixes situation 2, by always taking the roleAudience into account, even when the projectID is empty. The code responsible for the bug is also refactored to be more readable and understandable, including additional godoc.

The fix only applies to the optimized userinfo code introduced in zitadel#7706 and released in v2.50 (currently in RC). Therefore it can't be back-ported to earlier versions.

Fixes zitadel#6662

* chore(deps): update all go deps (zitadel#7764)

This change updates all go modules, including oidc, a major version of go-jose and the go 1.22 release.

* Revert "chore(deps): update all go deps" (zitadel#7772)

Revert "chore(deps): update all go deps (zitadel#7764)"

This reverts commit 6893e7d.

---------

Co-authored-by: Livio Spring <livio.a@gmail.com>
(cherry picked from commit 1069c92)

This branch was successfully deployed

1 active deployment
Preview — 0ced5a1b Deployed Apr 9, 2024 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Optimize UserInfo endpoint

2 participants