feat(security): let a consumer supply the access token via setAccessTokenResolver - #329
Open
gcutrini wants to merge 2 commits into
Open
feat(security): let a consumer supply the access token via setAccessTokenResolver#329gcutrini wants to merge 2 commits into
gcutrini wants to merge 2 commits into
Conversation
…okenResolver Add setAccessTokenResolver: when a resolver is registered, getAccessToken delegates to it; otherwise the built-in flow is unchanged. Passing a non-function resets to the built-in. The resolver is module-level state, so externalize security/methods in the webpack build so every uicore lib entry shares one instance and sees the registered resolver.
Delegates to a registered resolver, a later resolver replaces the previous one, and a non-function argument clears it.
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
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.
ref: https://app.clickup.com/t/86bbnquuq
5.x line companion of #324 (same change on the v4.x line).
uicore's
getAccessTokenassumes the access token lives on the client. It reads and refreshes the token from local storage and serializes refreshes withnavigator.locks. That model does not fit a server-rendered host such as the Next.js event site, where the token is held in an encrypted httpOnly cookie and is never exposed to JavaScript. There is no client-side token for uicore to read, lock, or renew.Keeping the token out of JavaScript is also a deliberate security property. A token that never reaches the browser's JS context cannot be stolen by XSS or replayed from client code.
Several uicore modules call
getAccessToken, so the source must be injectable inside uicore rather than overridden by the consumer. Today a cookie-based host has to work around this by aliasingsecurity/methodsat build time and substituting its own implementation, which is invasive (build-system specific, replaces the whole module) and easy to drift out of sync.What
Add
setAccessTokenResolvertosecurity/methods: a consumer registers where the access token comes from, without replacing anything.getAccessToken. When a resolver is registered,getAccessTokendelegates to it; otherwise the built-in flow is unchanged. Passing a non-function resets to the built-in.setAccessTokenResolver.Renewal is the consumer's concern
When a resolver is registered, uicore delegates token retrieval to it and does not apply its own storage, locking, or renewal to the returned value. Freshness is left entirely to the consumer. A cookie-based host, for example, renews server-side (the server refreshes the session cookie via the refresh_token grant, and proxied API calls attach the real bearer from the cookie) and hands uicore only a "session present" placeholder, so there is nothing on the client to lock or renew.
Implementation note
The resolver is module-level state, so
security/methodsis also externalized in the webpack build. That way every uicore lib entry shares onemethodsinstance and sees the registered resolver; otherwise an entry that inlines its own copy keeps its own null resolver and ignores it.