Browse Source

auth flow updated

pull/23416/head
erdemcaygor 1 year ago
parent
commit
7fd22d518f
  1. 1
      npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts
  2. 1
      npm/ng-packs/apps/dev-app/src/environments/environment.ts
  3. 2
      npm/ng-packs/apps/dev-app/src/server.ts
  4. 2
      npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts
  5. 2
      npm/ng-packs/packages/core/src/lib/models/environment.ts
  6. 28
      npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts

1
npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts

@ -16,6 +16,7 @@ export const environment = {
clientId: 'MyProjectName_App', clientId: 'MyProjectName_App',
responseType: 'code', responseType: 'code',
scope: 'offline_access MyProjectName', scope: 'offline_access MyProjectName',
ssrAuthenticationUrl: '/authorize'
}, },
apis: { apis: {
default: { default: {

1
npm/ng-packs/apps/dev-app/src/environments/environment.ts

@ -16,6 +16,7 @@ export const environment = {
scope: 'offline_access MyProjectName', scope: 'offline_access MyProjectName',
responseType: 'code', responseType: 'code',
redirectUri: baseUrl, redirectUri: baseUrl,
ssrAuthorizationUrl: '/authorize'
}, },
apis: { apis: {
default: { default: {

2
npm/ng-packs/apps/dev-app/src/server.ts

@ -135,7 +135,7 @@ app.get('/', async (req, res, next) => {
const returnUrl = req.cookies.returnUrl || '/'; const returnUrl = req.cookies.returnUrl || '/';
res.clearCookie('returnUrl', secureCookie); res.clearCookie('returnUrl', secureCookie);
return res.redirect('/'); return res.redirect(returnUrl);
} catch (e) { } catch (e) {
console.error('OIDC error:', e); console.error('OIDC error:', e);
return res.status(500).send('oidc error'); return res.status(500).send('oidc error');

2
npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts

@ -26,4 +26,4 @@ export const authGuard: CanActivateFn = () => {
export const asyncAuthGuard: CanActivateFn = () => { export const asyncAuthGuard: CanActivateFn = () => {
console.error('You should add @abp/ng-oauth packages or create your own auth packages.'); console.error('You should add @abp/ng-oauth packages or create your own auth packages.');
return false; return false;
}; };

2
npm/ng-packs/packages/core/src/lib/models/environment.ts

@ -7,7 +7,7 @@ export interface Environment {
hmr?: boolean; hmr?: boolean;
test?: boolean; test?: boolean;
localization?: { defaultResourceName?: string }; localization?: { defaultResourceName?: string };
oAuthConfig?: AuthConfig & { impersonation?: Impersonation }; oAuthConfig?: AuthConfig & { impersonation?: Impersonation, ssrAuthorizationUrl?: string };
production: boolean; production: boolean;
remoteEnv?: RemoteEnv; remoteEnv?: RemoteEnv;
[key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any

28
npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts

@ -1,15 +1,16 @@
import { Injectable, inject } from '@angular/core'; import { Injectable, inject, PLATFORM_ID, RESPONSE_INIT } from '@angular/core';
import { import {
UrlTree, UrlTree,
ActivatedRouteSnapshot, ActivatedRouteSnapshot,
RouterStateSnapshot, RouterStateSnapshot,
CanActivateFn, CanActivateFn, Params,
} from '@angular/router'; } from '@angular/router';
import { Observable, timer, filter, take, map, firstValueFrom, timeout, catchError, of } from 'rxjs'; import { Observable, timer, filter, take, map, firstValueFrom, timeout, catchError, of } from 'rxjs';
import { OAuthService } from 'angular-oauth2-oidc'; import { OAuthService } from 'angular-oauth2-oidc';
import { AuthService, IAbpGuard, EnvironmentService } from '@abp/ng.core'; import { AuthService, IAbpGuard, EnvironmentService } from '@abp/ng.core';
import { isPlatformServer } from '@angular/common';
/** /**
* @deprecated Use `abpOAuthGuard` *function* instead. * @deprecated Use `abpOAuthGuard` *function* instead.
@ -42,6 +43,9 @@ export const abpOAuthGuard: CanActivateFn = (
) => { ) => {
const oAuthService = inject(OAuthService); const oAuthService = inject(OAuthService);
const authService = inject(AuthService); const authService = inject(AuthService);
const platformId = inject(PLATFORM_ID);
const resInit = inject(RESPONSE_INIT);
const environmentService = inject(EnvironmentService);
const hasValidAccessToken = oAuthService.hasValidAccessToken(); const hasValidAccessToken = oAuthService.hasValidAccessToken();
@ -50,10 +54,30 @@ export const abpOAuthGuard: CanActivateFn = (
} }
const params = { returnUrl: state.url }; const params = { returnUrl: state.url };
if (isPlatformServer(platformId) && resInit) {
const ssrAuthorizationUrl = environmentService.getEnvironment().oAuthConfig.ssrAuthorizationUrl;
const url = buildLoginUrl(ssrAuthorizationUrl, params);
const headers = new Headers(resInit.headers);
headers.set('Location', url);
resInit.status = 302;
resInit.statusText = 'Found';
resInit.headers = headers;
return;
}
authService.navigateToLogin(params); authService.navigateToLogin(params);
return false; return false;
}; };
export const buildLoginUrl = (path: string, params?: Params): string => {
if (!params || Object.keys(params).length === 0) return path;
const usp = new URLSearchParams();
for (const [k, v] of Object.entries(params)) {
if (v == null) continue;
Array.isArray(v) ? v.forEach(x => usp.append(k, String(x))) : usp.set(k, String(v));
}
return `${path}?${usp.toString()}`;
}
export const asyncAbpOAuthGuard: CanActivateFn = ( export const asyncAbpOAuthGuard: CanActivateFn = (
route: ActivatedRouteSnapshot, route: ActivatedRouteSnapshot,
state: RouterStateSnapshot, state: RouterStateSnapshot,

Loading…
Cancel
Save