Skip to content

Add forceRefresh parameter to getAccessToken() for near-expiry token recovery#137

Open
jethibau-msft wants to merge 1 commit intomicrosoft:masterfrom
jethibau-msft:fix/getAccessToken-forceRefresh
Open

Add forceRefresh parameter to getAccessToken() for near-expiry token recovery#137
jethibau-msft wants to merge 1 commit intomicrosoft:masterfrom
jethibau-msft:fix/getAccessToken-forceRefresh

Conversation

@jethibau-msft
Copy link
Copy Markdown

@jethibau-msft jethibau-msft commented Mar 27, 2026

Problem

SDK.getAccessToken() has no way to request a fresh token from the host. The IAuthorizationTokenProvider interface in azure-devops-extension-api already defines forceRefresh?: boolean on getAuthorizationHeader(), but getAccessToken() never accepted or forwarded this parameter.

Fix

Add an optional forceRefresh parameter to getAccessToken() and forward it to the host via XDM:

// Before
export async function getAccessToken(): Promise<string> {
    return parentChannel.invokeRemoteMethod<{ token: string }>("getAccessToken", hostControlId)
        .then((tokenObj) => { return tokenObj.token; });
}

// After
export async function getAccessToken(forceRefresh?: boolean): Promise<string> {
    return parentChannel.invokeRemoteMethod<{ token: string }>("getAccessToken", hostControlId, [forceRefresh])
        .then((tokenObj) => { return tokenObj.token; });
}

This is a backwards-compatible change — existing callers with no arguments are unaffected. The host-side DevOps.HostControl handler would also need to honor the parameter for the full flow to work.

Companion PR

The azure-devops-extension-api also has two bugs (broken 401 retry + default auth provider ignoring forceRefresh): microsoft/azure-devops-extension-api#187

Impact

Every ADO web extension using SDK.getAccessToken() or getClient() is affected during long-running sessions when tokens approach expiry.

The getAccessToken method now accepts an optional forceRefresh parameter
which is forwarded to the host frame via XDM. This allows the host to
return a fresh token instead of a cached one when requested.

This change enables the token refresh flow that IAuthorizationTokenProvider
defines (via its forceRefresh parameter on getAuthorizationHeader) but was
never wired through to the actual token acquisition.

Background: ADO services reject access tokens that are within ~5 minutes
of expiry. Extensions using SDK.getAccessToken() have no way to request a
fresh token when the host returns a near-expiry cached token. This change
enables that flow (pending host-side support for the parameter).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jethibau-msft
Copy link
Copy Markdown
Author

jethibau-msft commented Mar 27, 2026

@microsoft-github-policy-service agree company="Microsoft"

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.

1 participant