Skip to content

Commit 1148212

Browse files
committed
Merge branch 'token-federation-pr1-infrastructure' into token-federation-pr2-federation-caching
2 parents 3b71a3f + bbae46a commit 1148212

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

lib/connection/auth/tokenProvider/TokenProviderAuthenticator.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,21 @@ export default class TokenProviderAuthenticator implements IAuthentication {
3333

3434
logger.log(LogLevel.debug, `TokenProviderAuthenticator: getting token from ${providerName}`);
3535

36-
const token = await this.tokenProvider.getToken();
36+
let token = await this.tokenProvider.getToken();
3737

3838
if (token.isExpired()) {
39-
const message = `TokenProviderAuthenticator: token from ${providerName} is expired`;
40-
logger.log(LogLevel.error, message);
41-
throw new Error(message);
39+
logger.log(
40+
LogLevel.warn,
41+
`TokenProviderAuthenticator: token from ${providerName} is expired, requesting a new token`,
42+
);
43+
44+
token = await this.tokenProvider.getToken();
45+
46+
if (token.isExpired()) {
47+
const message = `TokenProviderAuthenticator: token from ${providerName} is still expired after refresh`;
48+
logger.log(LogLevel.error, message);
49+
throw new Error(message);
50+
}
4251
}
4352

4453
return token.setAuthHeader(this.headers);

tests/unit/connection/auth/tokenProvider/TokenProviderAuthenticator.test.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,35 @@ describe('TokenProviderAuthenticator', () => {
105105
}
106106
});
107107

108-
it('should throw error when token is expired', async () => {
108+
it('should retry once when token is expired and succeed with fresh token', async () => {
109+
const expiredDate = new Date(Date.now() - 60000);
110+
const freshDate = new Date(Date.now() + 3600000);
111+
const expiredToken = new Token('expired-token', { expiresAt: expiredDate });
112+
const freshToken = new Token('fresh-token', { expiresAt: freshDate });
113+
114+
let callCount = 0;
115+
const provider: ITokenProvider = {
116+
async getToken() {
117+
callCount += 1;
118+
return callCount === 1 ? expiredToken : freshToken;
119+
},
120+
getName() {
121+
return 'TestProvider';
122+
},
123+
};
124+
125+
const authenticator = new TokenProviderAuthenticator(provider, context);
126+
const headers = await authenticator.authenticate();
127+
128+
expect(callCount).to.equal(2);
129+
expect(headers).to.deep.equal({
130+
Authorization: 'Bearer fresh-token',
131+
});
132+
});
133+
134+
it('should throw error when token is still expired after retry', async () => {
109135
const provider = new MockTokenProvider('my-access-token', 'TestProvider');
110-
const expiredDate = new Date(Date.now() - 60000); // 1 minute ago
136+
const expiredDate = new Date(Date.now() - 60000);
111137
provider.setToken(new Token('expired-token', { expiresAt: expiredDate }));
112138
const authenticator = new TokenProviderAuthenticator(provider, context);
113139

0 commit comments

Comments
 (0)