import { Inject, Injectable } from '@angular/core'; import { OKTA_AUTH } from '@okta/okta-angular'; import OktaAuth from '@okta/okta-auth-js'; @Injectable({ providedIn: 'root' }) export class OktaTokenService { private employeeNumber: number = -1; private accessToken: string = ''; tokenExpiredInterval: any; userName: string | undefined = ''; constructor(@Inject(OKTA_AUTH) private oktaAuth: OktaAuth) { } setAccessToken(accessToken: string) { this.accessToken = accessToken; } getAccessToken() { return this.oktaAuth.getAccessToken() as string; } setEmployeeNumber(employeeNumber: number) { this.employeeNumber = employeeNumber } getEmployeeNumber(): number { return this.employeeNumber; } hasTokenExpired() { this.tokenExpiredInterval = setInterval(() => { var accessToken = this.oktaAuth.getAccessToken() as string; if (accessToken !== null || accessToken !== "" || accessToken !== undefined) { const currentDateTime: string = this.getCurrentDateTime(); const expiryTime: string = this.convertUnixTimestampToDateTime(this.getExpiryTime(accessToken)); if (expiryTime < currentDateTime) { this.oktaAuth.signOut(); clearInterval(this.tokenExpiredInterval); } } else { this.oktaAuth.signOut(); clearInterval(this.tokenExpiredInterval); } }, 2000); } getCurrentDateTime(): string { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); // Month is 0-based, so we add 1 const day = String(now.getDate()).padStart(2, '0'); const hours = String(now.getHours()).padStart(2, '0'); const minutes = String(now.getMinutes()).padStart(2, '0'); const seconds = String(now.getSeconds()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } convertUnixTimestampToDateTime(unixTimestamp: number): string { const date = new Date(unixTimestamp * 1000); // Convert Unix timestamp to milliseconds const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); const seconds = date.getSeconds().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } getExpiryTime(accessToken: string) { var base64Url: string = accessToken.split('.')[1]; var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); var jsonPayload: string = decodeURIComponent(window.atob(base64).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); let parsedPayload: any; try { parsedPayload = JSON.parse(jsonPayload); return parsedPayload["exp"]; } catch (error) { console.error("Error parsing JSON payload:", error); } } }