diff --git a/npm/ng-packs/apps/dev-app/src/environments/environment.ts b/npm/ng-packs/apps/dev-app/src/environments/environment.ts index 1e014dcaa7..45b31e8ef0 100644 --- a/npm/ng-packs/apps/dev-app/src/environments/environment.ts +++ b/npm/ng-packs/apps/dev-app/src/environments/environment.ts @@ -14,7 +14,7 @@ export const environment = { issuer: 'https://localhost:44305/', clientId: 'MyProjectName_App', scope: 'offline_access MyProjectName', - responseType: 'code', + // responseType: 'code', redirectUri: baseUrl, }, apis: { diff --git a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts index c3443427d2..9825fa953e 100644 --- a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts +++ b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts @@ -1,22 +1,71 @@ import { noop } from '@abp/ng.core'; import { Params } from '@angular/router'; -import { from, of } from 'rxjs'; +import { filter, from, of } from 'rxjs'; import { AuthFlowStrategy } from './auth-flow-strategy'; -import { deleteAllCookies } from '../utils/cookie-utils'; +import { getRememberMe, removeRememberMe, setRememberMe } from '../utils'; -export class AuthCodeFlowStrategy extends AuthFlowStrategy { +export class AuthCodeFlowStrategy extends AuthFlowStrategy{ readonly isInternalAuth = false; - private rememberMeKey = 'remember_me' + private remember_me = 'remember_me' async init() { - console.log('code flow'); - const accessToken = this.oAuthService.getAccessToken(); - let parsedToken = JSON.parse(atob(accessToken.split(".")[1]));; + this.checkRememberMeOption(); return super .init() .then(() => this.oAuthService.tryLogin().catch(noop)) - .then(() => this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token')); + .then(() => this.oAuthService.setupAutomaticSilentRefresh()) + // .then(() => this.listenToTokenExpiration()); + } + + // private listenToTokenExpiration() { + // this.oAuthService.events + // .pipe( + // filter( + // event => { + // return event instanceof OAuthInfoEvent && + // event.type === 'token_expires' && + // event.info === 'access_token' + // } + // ), + // ) + // .subscribe(() => { + // if (this.oAuthService.getRefreshToken()) { + // console.log('refresh token'); + // this.refreshToken(); + // } else { + // this.oAuthService.logOut(); + // removeRememberMe(this.localStorageService); + // this.configState.refreshAppState().subscribe(); + // } + // }); + // } + + private checkRememberMeOption() { + const accessToken = this.oAuthService.getAccessToken(); + const expireDate = this.oAuthService.getAccessTokenExpiration(); + const currentDate = new Date().getTime(); + let rememberMe = getRememberMe(this.localStorageService); + + if (accessToken && rememberMe === null) { + let parsedToken = JSON.parse(atob(accessToken.split(".")[1])); + + if (parsedToken[this.remember_me]) { + setRememberMe(true, this.localStorageService); + } else { + setRememberMe(false, this.localStorageService) + } + + } + rememberMe = getRememberMe(this.localStorageService); + + if (accessToken && expireDate < currentDate && rememberMe === 'false') { + removeRememberMe(this.localStorageService); + this.oAuthService.logOut(); + }else{ + console.log('try login'); + this.oAuthService.tryLogin().catch(noop) + } } navigateToLogin(queryParams?: Params) { @@ -35,6 +84,7 @@ export class AuthCodeFlowStrategy extends AuthFlowStrategy { } logout(queryParams?: Params) { + removeRememberMe(this.localStorageService); return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams))); } diff --git a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts index e5189966bd..4184cf2c8d 100644 --- a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts +++ b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts @@ -70,23 +70,20 @@ export abstract class AuthFlowStrategy { const shouldClear = shouldStorageClear(this.oAuthConfig.clientId, oAuthStorage); if (shouldClear) clearOAuthStorage(oAuthStorage); } - this.oAuthService.configure(this.oAuthConfig); - this.oAuthService.events .pipe(filter(event => event.type === 'token_refresh_error')) .subscribe(() => this.navigateToLogin()); - this.navigateToPreviousUrl(); - return this.oAuthService .loadDiscoveryDocument() .then(() => { - if (this.oAuthService.hasValidAccessToken() || !this.oAuthService.getRefreshToken()) { - return Promise.resolve(); + const expireDate = this.oAuthService.getAccessTokenExpiration(); + const currentDate = new Date().getTime(); + if (expireDate > currentDate || this.oAuthService.getRefreshToken()) { + return this.refreshToken(); } - - return this.refreshToken(); + return Promise.resolve(); }) .catch(this.catchError); } diff --git a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts index 74ffc3bd30..8936ebd0a5 100644 --- a/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts +++ b/npm/ng-packs/packages/oauth/src/lib/strategies/auth-password-flow-strategy.ts @@ -1,13 +1,12 @@ import { filter, switchMap, tap } from 'rxjs/operators'; import { OAuthInfoEvent } from 'angular-oauth2-oidc'; import { Params, Router } from '@angular/router'; -import { from, Observable, pipe } from 'rxjs'; +import { from, Observable } from 'rxjs'; import { HttpHeaders } from '@angular/common/http'; import { AuthFlowStrategy } from './auth-flow-strategy'; -import { pipeToLogin, removeRememberMe } from '../utils/auth-utils'; -import { LoginParams } from '@abp/ng.core'; +import { getRememberMe, pipeToLogin, removeRememberMe } from '../utils/auth-utils'; +import { AbpLocalStorageService, LoginParams } from '@abp/ng.core'; import { clearOAuthStorage } from '../utils/clear-o-auth-storage'; -import { getCookieValueByName } from '../utils/cookie-utils'; export class AuthPasswordFlowStrategy extends AuthFlowStrategy { readonly isInternalAuth = true; @@ -18,10 +17,11 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { this.oAuthService.events .pipe( filter( - event => - event instanceof OAuthInfoEvent && + event => { + return event instanceof OAuthInfoEvent && event.type === 'token_expires' && - event.info === 'access_token', + event.info === 'access_token' + } ), ) .subscribe(() => { @@ -36,12 +36,21 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { } async init() { - if (!(getCookieValueByName(this.cookieKey) === 'true') && localStorage.getItem(this.storageKey)) { + this.checkRememberMeOption(this.localStorageService); + + return super.init().then(() => this.listenToTokenExpiration()); + } + + private checkRememberMeOption(localStorageService: AbpLocalStorageService) { + const accessToken = this.oAuthService.getAccessToken(); + const expireDate = this.oAuthService.getAccessTokenExpiration(); + const currentDate = new Date().getTime(); + const rememberMe = getRememberMe(localStorageService) === 'true'; + + if (accessToken && expireDate < currentDate && !rememberMe) { removeRememberMe(this.localStorageService); this.oAuthService.logOut(); } - - return super.init().then(() => this.listenToTokenExpiration()); } navigateToLogin(queryParams?: Params) { @@ -77,6 +86,7 @@ export class AuthPasswordFlowStrategy extends AuthFlowStrategy { } protected refreshToken() { + console.log('token refreshed'); return this.oAuthService.refreshToken().catch(() => { clearOAuthStorage(); removeRememberMe(this.localStorageService); diff --git a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts index bd50e97ee7..9bc14d7e31 100644 --- a/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts +++ b/npm/ng-packs/packages/oauth/src/lib/utils/auth-utils.ts @@ -11,6 +11,7 @@ import { const cookieKey = 'rememberMe'; const storageKey = 'passwordFlow'; +const remember_me = 'remember_me'; export const pipeToLogin: PipeToLoginFn = function ( params: Pick, @@ -32,14 +33,15 @@ export function setRememberMe( remember: boolean | undefined, localStorageService: AbpLocalStorageService, ) { - removeRememberMe(localStorageService); - localStorageService.setItem(storageKey, 'true'); - document.cookie = `${cookieKey}=true; path=/${ - remember ? ' ;expires=Fri, 31 Dec 9999 23:59:59 GMT' : '' - }`; + console.log('set Remember Me'); + localStorageService.setItem(remember_me, JSON.stringify(remember)); } export function removeRememberMe(localStorageService: AbpLocalStorageService) { - localStorageService.removeItem(storageKey); - document.cookie = cookieKey + '= ; path=/; expires = Thu, 01 Jan 1970 00:00:00 GMT'; + console.log('remove remember Me'); + localStorageService.removeItem(remember_me); +} + +export function getRememberMe(localStorageService: AbpLocalStorageService){ + return localStorageService.getItem(remember_me); } diff --git a/npm/ng-packs/packages/oauth/src/lib/utils/cookie-utils.ts b/npm/ng-packs/packages/oauth/src/lib/utils/cookie-utils.ts deleted file mode 100644 index e31d4944ff..0000000000 --- a/npm/ng-packs/packages/oauth/src/lib/utils/cookie-utils.ts +++ /dev/null @@ -1,29 +0,0 @@ -export function getCookieValueByName(name: string) { - const cookiesArray = document.cookie.split(';'); - - for (let i = 0; i < cookiesArray.length; i++) { - let cookie = cookiesArray[i].trim(); - - if (cookie.startsWith(name + '=')) { - return cookie.substring(name.length + 1); - } - } - return null; -} - -export function deleteAllCookies() { - var cookies = document.cookie.split("; "); - for (var c = 0; c < cookies.length; c++) { - var d = window.location.hostname.split("."); - while (d.length > 0) { - var cookieBase = encodeURIComponent(cookies[c].split(";")[0].split("=")[0]) + '=; expires=Thu, 01-Jan-1970 00:00:01 GMT; domain=' + d.join('.') + ' ;path='; - var p = location.pathname.split('/'); - document.cookie = cookieBase + '/'; - while (p.length > 0) { - document.cookie = cookieBase + p.join('/'); - p.pop(); - }; - d.shift(); - } - } -} \ No newline at end of file