Skip to content

Commit 2204c5a

Browse files
committed
fix: Refresh tokens with a plus sign get corrupted before sending to token endpoint
1 parent bbff95b commit 2204c5a

File tree

4 files changed

+18
-9
lines changed

4 files changed

+18
-9
lines changed

projects/lib/src/interceptors/default-oauth.interceptor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class DefaultOAuthInterceptor implements HttpInterceptor {
3434

3535
if (this.moduleConfig.resourceServer.allowedUrls) {
3636
return !!this.moduleConfig.resourceServer.allowedUrls.find(u =>
37-
url.startsWith(u)
37+
url.toLowerCase().startsWith(u.toLowerCase())
3838
);
3939
}
4040

projects/lib/src/oauth-service.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
911911
);
912912

913913
return new Promise((resolve, reject) => {
914-
let params = new HttpParams()
914+
let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })
915915
.set('grant_type', 'refresh_token')
916916
.set('scope', this.scope)
917917
.set('refresh_token', this._storage.getItem('refresh_token'));
@@ -1644,7 +1644,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
16441644
if (grantedScopes && !Array.isArray(grantedScopes)) {
16451645
this._storage.setItem(
16461646
'granted_scopes',
1647-
JSON.stringify(grantedScopes.split('+'))
1647+
JSON.stringify(grantedScopes.split(' '))
16481648
);
16491649
} else if (grantedScopes && Array.isArray(grantedScopes)) {
16501650
this._storage.setItem('granted_scopes', JSON.stringify(grantedScopes));
@@ -1717,7 +1717,11 @@ export class OAuthService extends AuthConfig implements OnDestroy {
17171717
.replace(/session_state=[^&\$]*/, '')
17181718
.replace(/^\?&/, '?')
17191719
.replace(/&$/, '')
1720-
.replace(/^\?$/, '') + location.hash;
1720+
.replace(/^\?$/, '')
1721+
.replace(/&+/g, '&')
1722+
.replace(/\?&/, '?')
1723+
.replace(/\?$/, '')
1724+
+ location.hash;
17211725

17221726
history.replaceState(null, window.name, href);
17231727
}
@@ -1781,7 +1785,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
17811785
code: string,
17821786
options: LoginOptions
17831787
): Promise<object> {
1784-
let params = new HttpParams()
1788+
let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() })
17851789
.set('grant_type', 'authorization_code')
17861790
.set('code', code)
17871791
.set('redirect_uri', options.customRedirectUri || this.redirectUri);
@@ -2352,7 +2356,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
23522356
if (this.getAccessToken()) {
23532357
const expiresAt = this._storage.getItem('expires_at');
23542358
const now = this.dateTimeService.new();
2355-
if (expiresAt && parseInt(expiresAt, 10) < now.getTime()) {
2359+
if (expiresAt && parseInt(expiresAt, 10) < now.getTime() + this.clockSkewInSec) {
23562360
return false;
23572361
}
23582362

@@ -2369,7 +2373,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
23692373
if (this.getIdToken()) {
23702374
const expiresAt = this._storage.getItem('id_token_expires_at');
23712375
const now = this.dateTimeService.new();
2372-
if (expiresAt && parseInt(expiresAt, 10) < now.getTime()) {
2376+
if (expiresAt && parseInt(expiresAt, 10) < now.getTime() + this.clockSkewInSec) {
23732377
return false;
23742378
}
23752379

@@ -2471,7 +2475,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
24712475
.replace(/\{\{id_token\}\}/, encodeURIComponent(id_token))
24722476
.replace(/\{\{client_id\}\}/, encodeURIComponent(this.clientId));
24732477
} else {
2474-
let params = new HttpParams();
2478+
let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() });
24752479

24762480
if (id_token) {
24772481
params = params.set('id_token_hint', id_token);
@@ -2709,7 +2713,7 @@ export class OAuthService extends AuthConfig implements OnDestroy {
27092713
return;
27102714
}
27112715

2712-
let params = new HttpParams();
2716+
let params = new HttpParams({ encoder: new WebHttpUrlEncodingCodec() });
27132717

27142718
let headers = new HttpHeaders().set(
27152719
'Content-Type',

projects/lib/src/public_api.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ export * from './interceptors/default-oauth.interceptor';
1313
export * from './interceptors/resource-server-error-handler';
1414
export * from './oauth-module.config';
1515
export * from './date-time-provider';
16+
export * from './token-validation/hash-handler';

projects/sample/src/app/app.component.ts

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ export class AppComponent {
2828
.subscribe(_ => {
2929
console.debug('state', this.oauthService.state);
3030
this.oauthService.loadUserProfile();
31+
32+
const scopes = this.oauthService.getGrantedScopes();
33+
console.debug('scopes', scopes);
34+
3135
});
3236
}
3337

0 commit comments

Comments
 (0)