ekangularbasetest3
Version:
Authentication service for usermanagement(oidc client)
328 lines (270 loc) • 10.7 kB
text/typescript
import { Injectable } from '@angular/core';
import { UserManager, UserManagerSettings, User } from 'oidc-client';
//import { JwtHelperService } from '@auth0/angular-jwt';
import decode from 'jwt-decode';
import { HttpClient } from '@angular/common/http';
import { AppConfig } from '../AppConfig/AppConfig';
import { OcBasedPermission } from './OcBasedPermission';
import { OcBasedPermissionService } from './OcBasedPermission.service';
import { BehaviorSubject } from 'rxjs';
export class AuthService {
private manager: UserManager;
private user: User = null;
private selectedocCode: string = null;
private userPermission: string[] = [];
// private observerStatus: string[] = [];
private ocBasedPermission: OcBasedPermission[] = [];
private decodedtoken: any;
public loadingcompleted: BehaviorSubject<boolean>;
public SelectedOcChanged: BehaviorSubject<string>;
private selectedoc: string;
constructor(private http: HttpClient, private ocBasePermissionService: OcBasedPermissionService) {
this.loadingcompleted = new BehaviorSubject(false);
this.SelectedOcChanged = new BehaviorSubject("");
}
load() {
this.manager = new UserManager(getClientSettings(this.http));
this.manager.getUser().then(user => {
this.user = user;
this.decodedtoken = decode(this.user.access_token);
this.changeSelectedOc(this.decodedtoken.defaultoc);
// this.userPermission = this.getPermissions();
this.getOcBasedPermissions();
this.userPermission = this.getPermissions();
this.loadingcompleted.next(true);
}).catch(function (err) {
console.log(err);
});
this.InitStorageListener();
}
readonly MARKER_KEY = "fjslafjlak789543758934jkfjsdkj%^&*";
readonly SET_KEY = "lafkj^&*8230394hfslajfasl";
InitStorageListener() {
console.log("sessionStorage.Init");
console.log(AppConfig);
let rediret: string = AppConfig.settings.usermanagementurl;
console.log(rediret);
// rediret = rediret.substring(0, rediret.length - 1) + 'ui/';
// console.log(rediret);
// We listen to changes on localstorage (the listener will only be fired if
// another Browser-Tab makes changes)
window.addEventListener("storage", (event: StorageEvent) => {
if (event.key === this.MARKER_KEY) {
// Another Browser-Tab removed the magic entry in localStorage (he logged out)
// so we remove our tokens as well
console.log("sessionStorage.clear");
sessionStorage.clear();
// this.manager.removeUser();
// this.manager.clearStaleState();
// this.logOut();
console.log(rediret);
window.open(rediret
, '_self');
}
});
}
getItem(key: string): string {
return sessionStorage.getItem(key);
}
removeItem(key: string): void {
sessionStorage.removeItem(key);
if (key === this.SET_KEY) {
// User has logged out on this Browser-Tab
// Remove the magic entry on localStorage to tell other Browser-Tabs that they should
// clear their session storage
console.log("localStorage.removeItem");
localStorage.removeItem(this.MARKER_KEY);
}
}
setItem(key: string, data: string): void {
this.removeItem(this.SET_KEY);
sessionStorage.setItem(key, data);
if (key === this.SET_KEY) {
// User has logged in on this Browser-Tab
// Set the magic entry that, when removed, fires events on other Browser-Tabs
console.log("localStorage.setItem");
localStorage.setItem(this.MARKER_KEY, "true");
}
}
logOut() {
this.manager.signoutRedirect().then((user) => {
// This will clear the OpenID access tokens that is stored in the session
// this.manager.removeUser();
// this.manager.clearStaleState();
// localStorage.clear();
this.setItem(this.SET_KEY, 'logout');
});
}
getSelectedOc(): string {
return this.selectedoc;
}
changeSelectedOc(oc: string) {
this.selectedoc = oc;
this.SelectedOcChanged.next(this.selectedoc);
}
getUserName(): string {
if (this.user != null) {
return this.user.profile.name;
}
else {
return null;
}
}
getUserId(): string {
if (this.user != null) {
// console.log(this.user.profile);
return this.user.profile.sub;
}
else {
return null;
}
}
isLoggedIn(): boolean {
return this.user != null && !this.user.expired;
}
//public isAuthenticated(): boolean {
// const token = localStorage.getItem('token');
// // Check whether the token is expired and return
// // true or false
// return !this.jwtHelper.isTokenExpired(token);
//}
getRoles(): string[] {
if (this.user != null) {
return this.decodedtoken.role;
}
else {
return [''];
}
}
getPermissions(): string[] {
if (this.user != null) {
let x: string[] = JSON.parse(this.decodedtoken.p);
if (this.ocBasedPermission != null && this.ocBasedPermission.length >= 1) {
var plist = this.ocBasedPermission.find(s => s.ocCode == this.getSelectedOc());
for (let item of plist.permission) {
if (!x.includes(item)) { x.push(item); }
}
}
return x;
}
else {
// alert('No permision');
return [''];
}
}
isPasswordExpired(): boolean {
let result: boolean = false;
try {
if (this.user != null) {
// alert(this.decodedtoken.PasswordExpired);
result = this.decodedtoken.PasswordExpired;
}
} catch (error) {
console.log(error);
}
return result;
}
// getObserverStatus(): string[] {
// if (this.user != null) {
// let x:string[]= JSON.parse(this.decodedtoken.s);
// // alert('ss:'+JSON.stringify(x));
// return x;
// }
// else {
// // alert('No permision');
// return [''];
// }
// }
getOcBasedPermissions() {
this.ocBasePermissionService.GetByUserName(this.getUserName(), this.getAuthorizationHeaderValue())
.subscribe(res => {
this.ocBasedPermission = res;
// alert(JSON.stringify(this.ocBasedPermission));
}
);
}
getOcCodes(): string[] {
if (this.user != null) {
return this.decodedtoken.occode;
}
else {
// alert('No permision');
return [''];
}
}
getClaims(): any {
// console.error(JSON.stringify(this.user.scopes));
// console.error(JSON.stringify(this.user.session_state));
// console.error(JSON.stringify(this.user.profile));
return this.user.profile;
}
hasPermissions(targetpermission: string): boolean {
if (this.user != null) {
// const tokenPayload = decode(this.user.access_token);
// let permissionlist:string[]= JSON.parse(tokenPayload.p);
return this.userPermission.some(s => s.toUpperCase() === targetpermission.toUpperCase());
}
else {
// alert('No permision');
return false;
}
}
getAuthorizationHeaderValue(): string {
// console.log(`${this.user.token_type} ${this.user.access_token}`);
if (this.user != null && this.user.access_token != null) { return `${this.user.token_type} ${this.user.access_token}`; }
else {
return "";
}
}
getAccessToken(): string {
// console.log(`${this.user.token_type} ${this.user.access_token}`);
if (this.user != null) { return `${this.user.access_token}`; }
else { return ""; }
}
startAuthentication(): Promise<void> {
// alert('ss1');
return this.manager.signinRedirect();
}
getExpiresIn(): number {
// alert("1");
if (this.user != null) {
// console.log(this.user.expires_in);
return this.user.expires_in;
}
else return 0;
}
completeAuthentication(): Promise<void> {
// alert("completeAuthentication");
return this.manager.signinRedirectCallback().then(user => {
// alert('ss');
this.user = user;
this.load();
// this.decodedtoken=decode(this.user.access_token);
// this.selectedoc=this.decodedtoken.defaultoc;
// this.userPermission = this.getPermissions();
// this.getOcBasedPermissions();
});
}
}
export function getClientSettings(http: HttpClient): UserManagerSettings {
// http.get<any>('assets/showcase/data/cars-small.json')
// var usersettings:any;
// http.get<any>('assets/config/appsettings.json')
// .subscribe(result => {
// usersettings=result.UserManagerSettings;
// });
var usersettings = AppConfig.settings.UserManagerSettings;
return {
authority: usersettings.authority,//'http://localhost:5000/',
client_id: usersettings.client_id,//'angular_spa',
redirect_uri: usersettings.redirect_uri,//'http://localhost:4200/#/auth-callback#',
post_logout_redirect_uri: usersettings.post_logout_redirect_uri,//'http://localhost:4200/',
response_type: usersettings.response_type,//"id_token token",
scope: usersettings.scope,//"openid profile api1",
filterProtocolClaims: usersettings.filterProtocolClaims,//,
loadUserInfo: usersettings.loadUserInfo,//true,
automaticSilentRenew: usersettings.automaticSilentRenew,//true,
silent_redirect_uri: usersettings.silent_redirect_uri//'http://localhost:4200/silent-refresh.html'
};
}