Browse Source

fix reviews

pull/18768/head
Sinan Öztürk 3 years ago
parent
commit
5857c5551b
  1. 28
      npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts
  2. 10
      npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts
  3. 29
      npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts
  4. 41
      npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts

28
npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts

@ -2,11 +2,12 @@ import { noop } from '@abp/ng.core';
import { Params } from '@angular/router'; import { Params } from '@angular/router';
import { from, of } from 'rxjs'; import { from, of } from 'rxjs';
import { AuthFlowStrategy } from './auth-flow-strategy'; import { AuthFlowStrategy } from './auth-flow-strategy';
import { getRememberMe, removeRememberMe, setRememberMe } from '../utils'; import { RememberMeService, isTokenExpired } from '../utils';
export class AuthCodeFlowStrategy extends AuthFlowStrategy { export class AuthCodeFlowStrategy extends AuthFlowStrategy {
readonly isInternalAuth = false; readonly isInternalAuth = false;
private remember_me = 'remember_me' private rememberMe = 'remember_me'
rememberMeService = new RememberMeService(this.injector);
async init() { async init() {
this.checkRememberMeOption(); this.checkRememberMeOption();
@ -19,24 +20,23 @@ export class AuthCodeFlowStrategy extends AuthFlowStrategy {
private checkRememberMeOption() { private checkRememberMeOption() {
const accessToken = this.oAuthService.getAccessToken(); const accessToken = this.oAuthService.getAccessToken();
const expireDate = this.oAuthService.getAccessTokenExpiration(); const isTokenExpire = isTokenExpired(this.oAuthService);
const currentDate = new Date().getTime(); let rememberMe = Boolean(JSON.parse(this.rememberMeService.getRememberMe()));
let rememberMe = getRememberMe(this.localStorageService);
if (accessToken && rememberMe === null) { if (accessToken && !rememberMe) {
let parsedToken = JSON.parse(atob(accessToken.split(".")[1])); let parsedToken = JSON.parse(atob(accessToken.split(".")[1]));
let rememberMeValue = parsedToken[this.remember_me]; const rememberMeValue = Boolean(parsedToken[this.rememberMe]);
if (rememberMeValue && (rememberMeValue === 'True' || rememberMeValue === 'true')) { if (rememberMeValue) {
setRememberMe(true, this.localStorageService); this.rememberMeService.setRememberMe(true);
} else { } else {
setRememberMe(false, this.localStorageService) this.rememberMeService.setRememberMe(false)
} }
} }
rememberMe = getRememberMe(this.localStorageService); rememberMe = Boolean(JSON.parse(this.rememberMeService.getRememberMe()));
if (accessToken && expireDate < currentDate && rememberMe !== 'true') { if (accessToken && isTokenExpire && !rememberMe) {
removeRememberMe(this.localStorageService); this.rememberMeService.removeRememberMe();
this.oAuthService.logOut(); this.oAuthService.logOut();
} }
} }
@ -57,7 +57,7 @@ export class AuthCodeFlowStrategy extends AuthFlowStrategy {
} }
logout(queryParams?: Params) { logout(queryParams?: Params) {
removeRememberMe(this.localStorageService); this.rememberMeService.removeRememberMe();
return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams))); return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams)));
} }

10
npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts

@ -24,6 +24,7 @@ import {
import { clearOAuthStorage } from '../utils/clear-o-auth-storage'; import { clearOAuthStorage } from '../utils/clear-o-auth-storage';
import { oAuthStorage } from '../utils/oauth-storage'; import { oAuthStorage } from '../utils/oauth-storage';
import { OAuthErrorFilterService } from '../services'; import { OAuthErrorFilterService } from '../services';
import { isTokenExpired } from '../utils';
export abstract class AuthFlowStrategy { export abstract class AuthFlowStrategy {
abstract readonly isInternalAuth: boolean; abstract readonly isInternalAuth: boolean;
@ -78,11 +79,12 @@ export abstract class AuthFlowStrategy {
return this.oAuthService return this.oAuthService
.loadDiscoveryDocument() .loadDiscoveryDocument()
.then(() => { .then(() => {
if (this.oAuthService.hasValidAccessToken() || !this.oAuthService.getRefreshToken()) { const isTokenExpire = isTokenExpired(this.oAuthService);
return Promise.resolve(); if (!isTokenExpire || this.oAuthService.getRefreshToken()) {
return this.refreshToken();
} }
return this.refreshToken(); return Promise.resolve();
}) })
.catch(this.catchError); .catch(this.catchError);
} }

29
npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts

@ -4,24 +4,21 @@ import { Params, Router } from '@angular/router';
import { from, Observable } from 'rxjs'; import { from, Observable } from 'rxjs';
import { HttpHeaders } from '@angular/common/http'; import { HttpHeaders } from '@angular/common/http';
import { AuthFlowStrategy } from './auth-flow-strategy'; import { AuthFlowStrategy } from './auth-flow-strategy';
import { getRememberMe, pipeToLogin, removeRememberMe } from '../utils/auth-utils'; import { RememberMeService, isTokenExpired, pipeToLogin } from '../utils/auth-utils';
import { AbpLocalStorageService, LoginParams } from '@abp/ng.core'; import { AbpLocalStorageService, LoginParams } from '@abp/ng.core';
import { clearOAuthStorage } from '../utils/clear-o-auth-storage'; import { clearOAuthStorage } from '../utils/clear-o-auth-storage';
export class AuthPasswordFlowStrategy extends AuthFlowStrategy { export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
readonly isInternalAuth = true; readonly isInternalAuth = true;
private cookieKey = 'rememberMe'; rememberMeService = new RememberMeService(this.injector);
private storageKey = 'passwordFlow';
private listenToTokenExpiration() { private listenToTokenExpiration() {
this.oAuthService.events this.oAuthService.events
.pipe( .pipe(
filter( filter(
event => { event => event instanceof OAuthInfoEvent &&
return event instanceof OAuthInfoEvent &&
event.type === 'token_expires' && event.type === 'token_expires' &&
event.info === 'access_token' event.info === 'access_token'
}
), ),
) )
.subscribe(() => { .subscribe(() => {
@ -29,26 +26,24 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
this.refreshToken(); this.refreshToken();
} else { } else {
this.oAuthService.logOut(); this.oAuthService.logOut();
removeRememberMe(this.localStorageService); this.rememberMeService.removeRememberMe();
this.configState.refreshAppState().subscribe(); this.configState.refreshAppState().subscribe();
} }
}); });
} }
async init() { async init() {
this.checkRememberMeOption(this.localStorageService); this.checkRememberMeOption(this.localStorageService);
return super.init().then(() => this.listenToTokenExpiration()); return super.init().then(() => this.listenToTokenExpiration());
} }
private checkRememberMeOption(localStorageService: AbpLocalStorageService) { private checkRememberMeOption(localStorageService: AbpLocalStorageService) {
const accessToken = this.oAuthService.getAccessToken(); const accessToken = this.oAuthService.getAccessToken();
const expireDate = this.oAuthService.getAccessTokenExpiration(); const isTokenExpire = isTokenExpired(this.oAuthService);
const currentDate = new Date().getTime(); const rememberMe = Boolean(JSON.parse(this.rememberMeService.getRememberMe()))
const rememberMe = getRememberMe(localStorageService); if (accessToken && isTokenExpire && !rememberMe) {
this.rememberMeService.removeRememberMe();
if (accessToken && expireDate < currentDate && rememberMe !== 'true') {
removeRememberMe(this.localStorageService);
this.oAuthService.logOut(); this.oAuthService.logOut();
} }
} }
@ -73,7 +68,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
), ),
).pipe(pipeToLogin(params, this.injector)); ).pipe(pipeToLogin(params, this.injector));
} }
logout() { logout() {
const router = this.injector.get(Router); const router = this.injector.get(Router);
const noRedirectToLogoutUrl = true; const noRedirectToLogoutUrl = true;
@ -81,7 +76,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
switchMap(() => this.configState.refreshAppState()), switchMap(() => this.configState.refreshAppState()),
tap(() => { tap(() => {
router.navigateByUrl('/'); router.navigateByUrl('/');
removeRememberMe(this.localStorageService); this.rememberMeService.removeRememberMe();
}), }),
); );
} }
@ -89,7 +84,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
protected refreshToken() { protected refreshToken() {
return this.oAuthService.refreshToken().catch(() => { return this.oAuthService.refreshToken().catch(() => {
clearOAuthStorage(); clearOAuthStorage();
removeRememberMe(this.localStorageService); this.rememberMeService.removeRememberMe();
}); });
} }
} }

41
npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts

@ -8,8 +8,26 @@ import {
PipeToLoginFn, PipeToLoginFn,
AbpLocalStorageService, AbpLocalStorageService,
} from '@abp/ng.core'; } from '@abp/ng.core';
import { OAuthService } from 'angular-oauth2-oidc';
const remember_me = 'remember_me'; const rememberMe = 'remember_me';
export class RememberMeService {
constructor(private injector: Injector) { }
localStorageService = this.injector.get(AbpLocalStorageService);
setRememberMe(remember: boolean) {
this.localStorageService.setItem(rememberMe, JSON.stringify(remember));
}
removeRememberMe() {
this.localStorageService.removeItem(rememberMe);
}
getRememberMe() {
return this.localStorageService.getItem(rememberMe);
}
}
export const pipeToLogin: PipeToLoginFn = function ( export const pipeToLogin: PipeToLoginFn = function (
params: Pick<LoginParams, 'redirectUrl' | 'rememberMe'>, params: Pick<LoginParams, 'redirectUrl' | 'rememberMe'>,
@ -17,27 +35,18 @@ export const pipeToLogin: PipeToLoginFn = function (
) { ) {
const configState = injector.get(ConfigStateService); const configState = injector.get(ConfigStateService);
const router = injector.get(Router); const router = injector.get(Router);
const localStorage = injector.get(AbpLocalStorageService); const rememberMeService = new RememberMeService(injector);
return pipe( return pipe(
switchMap(() => configState.refreshAppState()), switchMap(() => configState.refreshAppState()),
tap(() => { tap(() => {
setRememberMe(params.rememberMe, localStorage); rememberMeService.setRememberMe(params.rememberMe);
if (params.redirectUrl) router.navigate([params.redirectUrl]); if (params.redirectUrl) router.navigate([params.redirectUrl]);
}), }),
); );
}; };
export function setRememberMe( export function isTokenExpired(oAuthService: OAuthService): boolean {
remember: boolean, const expireDate = oAuthService.getAccessTokenExpiration();
localStorageService: AbpLocalStorageService, const currentDate = new Date().getTime();
) { return expireDate < currentDate;
localStorageService.setItem(remember_me, JSON.stringify(remember));
}
export function removeRememberMe(localStorageService: AbpLocalStorageService) {
localStorageService.removeItem(remember_me);
} }
export function getRememberMe(localStorageService: AbpLocalStorageService){
return localStorageService.getItem(remember_me);
}
Loading…
Cancel
Save