slr-angularx-social-login
Version:
Social login and authentication module for Angular 13. Supports authentication with Google, Facebook, Amazon, and VK. Can be extended to other providers also.
1 lines • 56 kB
Source Map (JSON)
{"version":3,"file":"slr-angularx-social-login.mjs","sources":["../../../projects/lib/src/entities/base-login-provider.ts","../../../projects/lib/src/entities/social-user.ts","../../../projects/lib/src/providers/google-login-provider.ts","../../../projects/lib/src/socialauth.service.ts","../../../projects/lib/src/sociallogin.module.ts","../../../projects/lib/src/providers/dummy-login-provider.ts","../../../projects/lib/src/providers/facebook-login-provider.ts","../../../projects/lib/src/providers/amazon-login-provider.ts","../../../projects/lib/src/providers/vk-login-provider.ts","../../../projects/lib/src/providers/microsoft-login-provider.ts","../../../projects/lib/src/slr-angularx-social-login.ts"],"sourcesContent":["import { LoginProvider } from './login-provider';\nimport { SocialUser } from './social-user';\n\nexport abstract class BaseLoginProvider implements LoginProvider {\n constructor() {}\n\n abstract initialize(): Promise<void>;\n abstract getLoginStatus(): Promise<SocialUser>;\n abstract signIn(): Promise<SocialUser>;\n abstract signOut(revoke?: boolean): Promise<void>;\n\n protected loadScript(\n id: string,\n src: string,\n onload: any,\n parentElement = null\n ): void {\n // get document if platform is only browser\n if (typeof document !== 'undefined' && !document.getElementById(id)) {\n let signInJS = document.createElement('script');\n\n signInJS.async = true;\n signInJS.src = src;\n signInJS.onload = onload;\n\n if (!parentElement) {\n parentElement = document.head;\n }\n\n parentElement.appendChild(signInJS);\n }\n }\n}\n","export class SocialUser {\n provider: string;\n id: string;\n email: string;\n name: string;\n photoUrl: string;\n firstName: string;\n lastName: string;\n authToken: string;\n\n idToken: string; // Reference https://developers.google.com/identity/sign-in/web/backend-auth\n authorizationCode: string; // Reference https://developers.google.com/identity/sign-in/web/reference#googleauthgrantofflineaccessoptions\n\n response: any;\n}\n","import { BaseLoginProvider } from '../entities/base-login-provider';\nimport { SocialUser } from '../entities/social-user';\n\ndeclare let gapi: any;\n\nexport class GoogleLoginProvider extends BaseLoginProvider {\n public static readonly PROVIDER_ID: string = 'GOOGLE';\n\n protected auth2: any;\n\n constructor(\n private clientId: string,\n private initOptions: any = { scope: 'email' }\n ) {\n super();\n }\n\n initialize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.loadScript(\n GoogleLoginProvider.PROVIDER_ID,\n 'https://apis.google.com/js/platform.js',\n () => {\n gapi.load('auth2', () => {\n this.auth2 = gapi.auth2.init({\n ...this.initOptions,\n client_id: this.clientId,\n });\n\n this.auth2\n .then(() => {\n resolve();\n })\n .catch((err: any) => {\n reject(err);\n });\n });\n }\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n\n getLoginStatus(loginStatusOptions?: any): Promise<SocialUser> {\n const options = {...this.initOptions, ...loginStatusOptions};\n\n return new Promise((resolve, reject) => {\n if (this.auth2.isSignedIn.get()) {\n let user: SocialUser = new SocialUser();\n\n const profile = this.auth2.currentUser.get().getBasicProfile();\n const authResponse = this.auth2.currentUser.get().getAuthResponse(true); // get complete authResponse object\n user.id = profile.getId();\n user.name = profile.getName();\n user.email = profile.getEmail();\n user.photoUrl = profile.getImageUrl();\n user.firstName = profile.getGivenName();\n user.lastName = profile.getFamilyName();\n user.response = authResponse;\n\n const resolveUser = authResponse => {\n user.authToken = authResponse.access_token;\n user.idToken = authResponse.id_token;\n\n resolve(user);\n };\n\n if (options.refreshToken) {\n this.auth2.currentUser.get().reloadAuthResponse().then(resolveUser);\n } else {\n const authResponse = this.auth2.currentUser.get().getAuthResponse(true);\n resolveUser(authResponse);\n }\n } else {\n reject(\n `No user is currently logged in with ${GoogleLoginProvider.PROVIDER_ID}`\n );\n }\n });\n }\n\n signIn(signInOptions?: any): Promise<SocialUser> {\n const options = { ...this.initOptions, ...signInOptions };\n\n return new Promise((resolve, reject) => {\n const offlineAccess: boolean = options && options.offline_access;\n let promise = !offlineAccess\n ? this.auth2.signIn(signInOptions)\n : this.auth2.grantOfflineAccess(signInOptions);\n\n promise\n .then(\n (response: any) => {\n let user: SocialUser = new SocialUser();\n\n if (response && response.code) {\n user.authorizationCode = response.code;\n } else {\n let profile = this.auth2.currentUser.get().getBasicProfile();\n let authResponse = this.auth2.currentUser.get().getAuthResponse(true);\n\n let token = authResponse.access_token;\n let backendToken = authResponse.id_token;\n\n user.id = profile.getId();\n user.name = profile.getName();\n user.email = profile.getEmail();\n user.photoUrl = profile.getImageUrl();\n user.firstName = profile.getGivenName();\n user.lastName = profile.getFamilyName();\n user.authToken = token;\n user.idToken = backendToken;\n\n user.response = authResponse;\n }\n\n resolve(user);\n },\n (closed: any) => {\n reject(closed);\n }\n )\n .catch((err: any) => {\n reject(err);\n });\n });\n }\n\n signOut(revoke?: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n let signOutPromise: Promise<any>;\n\n if (revoke) {\n signOutPromise = this.auth2.disconnect();\n } else {\n signOutPromise = this.auth2.signOut();\n }\n\n signOutPromise\n .then((err: any) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n })\n .catch((err: any) => {\n reject(err);\n });\n });\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { AsyncSubject, Observable, ReplaySubject } from 'rxjs';\nimport { LoginProvider } from './entities/login-provider';\nimport { SocialUser } from './entities/social-user';\nimport { GoogleLoginProvider } from './providers/google-login-provider';\n\n/**\n * An interface to define the shape of the service configuration options.\n */\nexport interface SocialAuthServiceConfig {\n autoLogin?: boolean;\n providers: { id: string; provider: LoginProvider }[];\n onError?: (error: any) => any;\n}\n\n/**\n * The service encapsulating the social login functionality. Exposes methods like\n * `signIn`, `signOut`. Also, exposes an `authState` `Observable` that one can\n * subscribe to get the current logged in user information.\n *\n * @dynamic\n */\n@Injectable()\nexport class SocialAuthService {\n private static readonly ERR_LOGIN_PROVIDER_NOT_FOUND =\n 'Login provider not found';\n private static readonly ERR_NOT_LOGGED_IN = 'Not logged in';\n private static readonly ERR_NOT_INITIALIZED =\n 'Login providers not ready yet. Are there errors on your console?';\n private static readonly ERR_NOT_SUPPORTED_FOR_REFRESH_TOKEN =\n 'Chosen login provider is not supported for refreshing a token';\n\n private providers: Map<string, LoginProvider> = new Map();\n private autoLogin = false;\n\n private _user: SocialUser = null;\n private _authState: ReplaySubject<SocialUser> = new ReplaySubject(1);\n\n /* Consider making this an enum comprising LOADING, LOADED, FAILED etc. */\n private initialized = false;\n private _initState: AsyncSubject<boolean> = new AsyncSubject();\n\n /** An `Observable` that one can subscribe to get the current logged in user information */\n get authState(): Observable<SocialUser> {\n return this._authState.asObservable();\n }\n\n /** An `Observable` to communicate the readiness of the service and associated login providers */\n get initState(): Observable<boolean> {\n return this._initState.asObservable();\n }\n\n /**\n * @param config A `SocialAuthServiceConfig` object or a `Promise` that resolves to a `SocialAuthServiceConfig` object\n */\n constructor(\n @Inject('SocialAuthServiceConfig')\n config: SocialAuthServiceConfig | Promise<SocialAuthServiceConfig>\n ) {\n if (config instanceof Promise) {\n config.then((config) => {\n this.initialize(config);\n });\n } else {\n this.initialize(config);\n }\n }\n\n private initialize(config: SocialAuthServiceConfig) {\n this.autoLogin = config.autoLogin !== undefined ? config.autoLogin : false;\n const { onError = console.error } = config;\n\n config.providers.forEach((item) => {\n this.providers.set(item.id, item.provider);\n });\n\n Promise.all(\n Array.from(this.providers.values()).map((provider) =>\n provider.initialize()\n )\n )\n .then(() => {\n if (this.autoLogin) {\n const loginStatusPromises = [];\n let loggedIn = false;\n\n this.providers.forEach((provider: LoginProvider, key: string) => {\n let promise = provider.getLoginStatus();\n loginStatusPromises.push(promise);\n promise\n .then((user: SocialUser) => {\n user.provider = key;\n\n this._user = user;\n this._authState.next(user);\n loggedIn = true;\n })\n .catch(console.debug);\n });\n Promise.all(loginStatusPromises).catch(() => {\n if (!loggedIn) {\n this._user = null;\n this._authState.next(null);\n }\n });\n }\n })\n .catch((error) => {\n onError(error);\n })\n .finally(() => {\n this.initialized = true;\n this._initState.next(this.initialized);\n this._initState.complete();\n });\n }\n\n refreshAuthToken(providerId: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.initialized) {\n reject(SocialAuthService.ERR_NOT_INITIALIZED);\n } else if (providerId !== GoogleLoginProvider.PROVIDER_ID) {\n reject(SocialAuthService.ERR_NOT_SUPPORTED_FOR_REFRESH_TOKEN);\n } else {\n const providerObject = this.providers.get(providerId);\n if (providerObject) {\n providerObject\n .getLoginStatus({ refreshToken: true })\n .then((user: SocialUser) => {\n user.provider = providerId;\n this._user = user;\n this._authState.next(user);\n resolve();\n })\n .catch((err) => {\n reject(err);\n });\n } else {\n reject(SocialAuthService.ERR_LOGIN_PROVIDER_NOT_FOUND);\n }\n }\n });\n }\n\n /**\n * A method used to sign in a user with a specific `LoginProvider`.\n *\n * @param providerId Id with which the `LoginProvider` has been registered with the service\n * @param signInOptions Optional `LoginProvider` specific arguments\n * @returns A `Promise` that resolves to the authenticated user information\n */\n signIn(providerId: string, signInOptions?: any): Promise<SocialUser> {\n return new Promise((resolve, reject) => {\n if (!this.initialized) {\n reject(SocialAuthService.ERR_NOT_INITIALIZED);\n } else {\n let providerObject = this.providers.get(providerId);\n if (providerObject) {\n providerObject\n .signIn(signInOptions)\n .then((user: SocialUser) => {\n user.provider = providerId;\n resolve(user);\n\n this._user = user;\n this._authState.next(user);\n })\n .catch((err) => {\n reject(err);\n });\n } else {\n reject(SocialAuthService.ERR_LOGIN_PROVIDER_NOT_FOUND);\n }\n }\n });\n }\n\n /**\n * A method used to sign out the currently loggen in user.\n *\n * @param revoke Optional parameter to specify whether a hard sign out is to be performed\n * @returns A `Promise` that resolves if the operation is successful, rejects otherwise\n */\n signOut(revoke: boolean = false): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!this.initialized) {\n reject(SocialAuthService.ERR_NOT_INITIALIZED);\n } else if (!this._user) {\n reject(SocialAuthService.ERR_NOT_LOGGED_IN);\n } else {\n let providerId = this._user.provider;\n let providerObject = this.providers.get(providerId);\n if (providerObject) {\n providerObject\n .signOut(revoke)\n .then(() => {\n resolve();\n\n this._user = null;\n this._authState.next(null);\n })\n .catch((err) => {\n reject(err);\n });\n } else {\n reject(SocialAuthService.ERR_LOGIN_PROVIDER_NOT_FOUND);\n }\n }\n });\n }\n}\n","import {\n NgModule,\n Optional,\n SkipSelf,\n ModuleWithProviders\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { SocialAuthService, SocialAuthServiceConfig } from './socialauth.service';\n\n/**\n * The main module of angularx-social-login library.\n */\n@NgModule({\n imports: [\n CommonModule\n ],\n providers: [\n SocialAuthService\n ]\n})\nexport class SocialLoginModule {\n public static initialize(config: SocialAuthServiceConfig): ModuleWithProviders<SocialLoginModule> {\n return {\n ngModule: SocialLoginModule,\n providers: [\n SocialAuthService,\n {\n provide: 'SocialAuthServiceConfig',\n useValue: config\n }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: SocialLoginModule) {\n if (parentModule) {\n throw new Error(\n 'SocialLoginModule is already loaded. Import it in the AppModule only');\n }\n }\n}\n","import { BaseLoginProvider } from '../entities/base-login-provider';\nimport { SocialUser } from '../entities/social-user';\n\n// Simulates login / logout without actually requiring an Internet connection.\n//\n// Useful for certain development situations.\n//\n// For example, if you want to simulate the greatest football referee England has ever produced:\n//\n// const dummyUser: SocialUser = {\n// id: '0123456789',\n// name: 'Howard Webb',\n// email: 'howard@webb.com',\n// firstName: 'Howard',\n// lastName: 'Webb',\n// authToken: 'dummyAuthToken',\n// photoUrl: 'https://en.wikipedia.org/wiki/Howard_Webb#/media/File:Howard_Webb_march11.jpg',\n// provider: 'DUMMY',\n// idToken: 'dummyIdToken',\n// authorizationCode: 'dummyAuthCode'\n// };\n//\n// let config = new AuthServiceConfig([\n// { ... },\n// {\n// id: DummyLoginProvider.PROVIDER_ID,\n// provider: new DummyLoginProvider(dummyUser) // Pass your user into the constructor\n// },\n// { ... }\n// ]);\n\nexport class DummyLoginProvider extends BaseLoginProvider {\n public static readonly PROVIDER_ID: string = 'DUMMY';\n\n static readonly DEFAULT_USER = {\n id: '1234567890',\n name: 'Mickey Mouse',\n email: 'mickey@mouse.com',\n firstName: 'Mickey',\n lastName: 'Mouse',\n authToken: 'dummyAuthToken',\n photoUrl: 'https://en.wikipedia.org/wiki/File:Mickey_Mouse.png',\n provider: 'DUMMY',\n idToken: 'dummyIdToken',\n authorizationCode: 'dummyAuthCode',\n response: {},\n };\n\n private dummy: SocialUser;\n\n private loggedIn: boolean;\n\n constructor(dummy?: SocialUser) {\n super();\n if (dummy) {\n this.dummy = dummy;\n } else {\n this.dummy = DummyLoginProvider.DEFAULT_USER;\n }\n\n // Start not logged in\n this.loggedIn = false;\n }\n\n getLoginStatus(): Promise<SocialUser> {\n return new Promise((resolve, reject) => {\n if (this.loggedIn) {\n resolve(this.dummy);\n } else {\n reject('No user is currently logged in.');\n }\n });\n }\n\n initialize(): Promise<void> {\n return new Promise((resolve, reject) => {\n resolve();\n });\n }\n\n signIn(): Promise<SocialUser> {\n return new Promise((resolve, reject) => {\n this.loggedIn = true;\n resolve(this.dummy);\n });\n }\n\n signOut(revoke?: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n this.loggedIn = false;\n resolve();\n });\n }\n}\n","import { BaseLoginProvider } from '../entities/base-login-provider';\nimport { SocialUser } from '../entities/social-user';\n\ndeclare let FB: any;\n\nexport class FacebookLoginProvider extends BaseLoginProvider {\n public static readonly PROVIDER_ID: string = 'FACEBOOK';\n\n private requestOptions = {\n scope: 'email,public_profile',\n locale: 'en_US',\n fields: 'name,email,picture,first_name,last_name',\n version: 'v10.0',\n };\n\n constructor(private clientId: string, initOptions: Object = {}) {\n super();\n\n this.requestOptions = {\n ...this.requestOptions,\n ...initOptions,\n };\n }\n\n initialize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.loadScript(\n FacebookLoginProvider.PROVIDER_ID,\n `//connect.facebook.net/${this.requestOptions.locale}/sdk.js`,\n () => {\n FB.init({\n appId: this.clientId,\n autoLogAppEvents: true,\n cookie: true,\n xfbml: true,\n version: this.requestOptions.version,\n });\n\n resolve();\n }\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n\n getLoginStatus(): Promise<SocialUser> {\n return new Promise((resolve, reject) => {\n FB.getLoginStatus((response: any) => {\n if (response.status === 'connected') {\n let authResponse = response.authResponse;\n FB.api(`/me?fields=${this.requestOptions.fields}`, (fbUser: any) => {\n let user: SocialUser = new SocialUser();\n\n user.id = fbUser.id;\n user.name = fbUser.name;\n user.email = fbUser.email;\n user.photoUrl =\n 'https://graph.facebook.com/' +\n fbUser.id +\n '/picture?type=normal&access_token=' +\n authResponse.accessToken;\n user.firstName = fbUser.first_name;\n user.lastName = fbUser.last_name;\n user.authToken = authResponse.accessToken;\n\n user.response = fbUser;\n\n resolve(user);\n });\n } else {\n reject(\n `No user is currently logged in with ${FacebookLoginProvider.PROVIDER_ID}`\n );\n }\n });\n });\n }\n\n signIn(signInOptions?: any): Promise<SocialUser> {\n const options = { ...this.requestOptions, ...signInOptions };\n return new Promise((resolve, reject) => {\n FB.login((response: any) => {\n if (response.authResponse) {\n let authResponse = response.authResponse;\n FB.api(`/me?fields=${options.fields}`, (fbUser: any) => {\n let user: SocialUser = new SocialUser();\n\n user.id = fbUser.id;\n user.name = fbUser.name;\n user.email = fbUser.email;\n user.photoUrl =\n 'https://graph.facebook.com/' +\n fbUser.id +\n '/picture?type=normal';\n user.firstName = fbUser.first_name;\n user.lastName = fbUser.last_name;\n user.authToken = authResponse.accessToken;\n\n user.response = fbUser;\n\n resolve(user);\n });\n } else {\n reject('User cancelled login or did not fully authorize.');\n }\n }, options);\n });\n }\n\n signOut(): Promise<void> {\n return new Promise((resolve, reject) => {\n FB.logout((response: any) => {\n resolve();\n });\n });\n }\n}\n","import { BaseLoginProvider } from '../entities/base-login-provider';\nimport { SocialUser } from '../entities/social-user';\n\ndeclare let amazon: any, window: any;\n\nexport class AmazonLoginProvider extends BaseLoginProvider {\n public static readonly PROVIDER_ID: string = 'AMAZON';\n\n constructor(\n private clientId: string,\n private initOptions: any = {\n scope: 'profile',\n scope_data: {\n profile: { essential: false },\n },\n redirect_uri: location.origin,\n }\n ) {\n super();\n }\n\n initialize(): Promise<void> {\n let amazonRoot = null;\n if (document) {\n amazonRoot = document.createElement('div');\n amazonRoot.id = 'amazon-root';\n document.body.appendChild(amazonRoot);\n }\n\n window.onAmazonLoginReady = () => {\n amazon.Login.setClientId(this.clientId);\n };\n\n return new Promise((resolve, reject) => {\n try {\n this.loadScript(\n 'amazon-login-sdk',\n 'https://assets.loginwithamazon.com/sdk/na/login1.js',\n () => {\n resolve();\n },\n amazonRoot\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n\n getLoginStatus(): Promise<SocialUser> {\n return new Promise((resolve, reject) => {\n let token = this.retrieveToken();\n\n if (token) {\n amazon.Login.retrieveProfile(token, (response) => {\n if (response.success) {\n let user: SocialUser = new SocialUser();\n\n user.id = response.profile.CustomerId;\n user.name = response.profile.Name;\n user.email = response.profile.PrimaryEmail;\n user.response = response.profile;\n\n resolve(user);\n } else {\n reject(response.error);\n }\n });\n } else {\n reject(`No user is currently logged in with ${AmazonLoginProvider.PROVIDER_ID}`);\n }\n });\n }\n\n signIn(signInOptions?: any): Promise<SocialUser> {\n const options = { ...this.initOptions, ...signInOptions };\n return new Promise((resolve, reject) => {\n amazon.Login.authorize(options, (authResponse) => {\n if (authResponse.error) {\n reject(authResponse.error);\n } else {\n amazon.Login.retrieveProfile(\n authResponse.access_token,\n (response) => {\n let user: SocialUser = new SocialUser();\n\n user.id = response.profile.CustomerId;\n user.name = response.profile.Name;\n user.email = response.profile.PrimaryEmail;\n user.authToken = authResponse.access_token;\n user.response = response.profile;\n\n this.persistToken(authResponse.access_token);\n\n resolve(user);\n }\n );\n }\n });\n });\n }\n\n signOut(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n amazon.Login.logout();\n\n this.clearToken();\n resolve();\n } catch (err) {\n reject(err.message);\n }\n });\n }\n\n private persistToken(token: string): void {\n localStorage.setItem(`${AmazonLoginProvider.PROVIDER_ID}_token`, token);\n }\n\n private retrieveToken(): string {\n return localStorage.getItem(`${AmazonLoginProvider.PROVIDER_ID}_token`);\n }\n\n private clearToken(): void {\n localStorage.removeItem(`${AmazonLoginProvider.PROVIDER_ID}_token`);\n }\n}\n","import { BaseLoginProvider } from '../entities/base-login-provider';\nimport { SocialUser } from '../entities/social-user';\n\ndeclare let VK: any;\n\nexport class VKLoginProvider extends BaseLoginProvider {\n constructor(\n private clientId: string,\n private initOptions: any = {\n fields: 'photo_max,contacts',\n version: '5.124',\n }\n ) {\n super();\n }\n\n public static readonly PROVIDER_ID: string = 'VK';\n\n private readonly VK_API_URL = '//vk.com/js/api/openapi.js';\n private readonly VK_API_GET_USER = 'users.get';\n\n initialize(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.loadScript(\n VKLoginProvider.PROVIDER_ID,\n this.VK_API_URL,\n () => {\n VK.init({\n apiId: this.clientId,\n });\n\n resolve();\n }\n );\n } catch (err) {\n reject(err);\n }\n });\n }\n\n getLoginStatus(): Promise<SocialUser> {\n return new Promise<SocialUser>((resolve: any, reject: any) =>\n this.getLoginStatusInternal(resolve, reject)\n );\n }\n\n signIn(): Promise<SocialUser> {\n return new Promise<SocialUser>((resolve: any, reject: any) =>\n this.signInInternal(resolve, reject)\n );\n }\n\n signOut(): Promise<void> {\n return new Promise((resolve, reject) => {\n VK.Auth.logout((response: any) => {\n resolve();\n });\n });\n }\n\n private signInInternal(resolve: any, reject: any) {\n VK.Auth.login((loginResponse: any) => {\n if (loginResponse.status === 'connected') {\n this.getUser(\n loginResponse.session.mid,\n loginResponse.session.sid,\n resolve\n );\n }\n });\n }\n\n private getUser(userId: any, token: any, resolve: any) {\n VK.Api.call(\n this.VK_API_GET_USER,\n {\n user_id: userId,\n fields: this.initOptions.fields,\n v: this.initOptions.version,\n },\n (userResponse: any) => {\n resolve(\n this.createUser(\n Object.assign({}, { token }, userResponse.response[0])\n )\n );\n }\n );\n }\n\n private getLoginStatusInternal(resolve: any, reject: any) {\n VK.Auth.getLoginStatus((loginResponse: any) => {\n if (loginResponse.status === 'connected') {\n this.getUser(\n loginResponse.session.mid,\n loginResponse.session.sid,\n resolve\n );\n }\n });\n }\n\n private createUser(response: any): SocialUser {\n const user: SocialUser = new SocialUser();\n user.id = response.id;\n user.name = `${response.first_name} ${response.last_name}`;\n user.photoUrl = response.photo_max;\n user.authToken = response.token;\n return user;\n }\n}\n","import { BaseLoginProvider } from '../entities/base-login-provider';\nimport { SocialUser } from '../entities/social-user';\n\n/**\n * Protocol modes supported by MSAL.\n */\nexport enum ProtocolMode {\n AAD = 'AAD',\n OIDC = 'OIDC'\n}\n\n/**\n * Initialization Options for Microsoft Provider: https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md\n * Details (not all options are supported): https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/configuration.md\n */\nexport type MicrosoftOptions = {\n redirect_uri?: string,\n logout_redirect_uri?: string,\n authority?: string,\n knownAuthorities?: string[],\n protocolMode?: ProtocolMode,\n clientCapabilities?: string[],\n cacheLocation?: string,\n scopes?: string[],\n prompt?: string,\n};\n\n// Collection of internal MSAL interfaces from: https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-browser/src\n\ninterface MSALAccount {\n environment: string;\n homeAccountId: string;\n tenantId: string;\n username: string;\n}\n\ninterface MSGraphUserInfo {\n businessPhones: string[];\n displayName: string;\n givenName: string;\n id: string;\n jobTitle: string;\n mail: string;\n mobilePhone: string;\n officeLocation: string;\n preferredLanguage: string;\n surname: string;\n userPrincipalName: string;\n}\n\ninterface MSALLoginRequest {\n scopes?: string[];\n sid?: string;\n loginHint?: string;\n domainHint?: string;\n prompt?: string;\n}\n\ninterface MSALLoginResponse {\n accessToken: string;\n account: MSALAccount;\n expiresOn: Date;\n extExpiresOn: Date;\n familyId: string;\n fromCache: boolean;\n idToken: string;\n idTokenClaims: any;\n scopes: string[];\n state: string;\n tenantId: string;\n uniqueId: string;\n}\n\ninterface MSALLogoutRequest {\n account?: MSALAccount;\n postLogoutRedirectUri?: string;\n authority?: string;\n correlationId?: string;\n}\n\ninterface MSALClientApplication {\n getAllAccounts(): MSALAccount[];\n logoutPopup(logoutRequest?: MSALLogoutRequest): Promise<void>;\n loginPopup(loginRequest: MSALLoginRequest): Promise<MSALLoginResponse>;\n ssoSilent(loginRequest: MSALLoginRequest): Promise<MSALLoginResponse>;\n acquireTokenSilent(loginRequest: MSALLoginRequest): Promise<MSALLoginResponse>;\n getAccountByHomeId(homeAccountId: string): MSALAccount;\n}\n\ndeclare let msal: any;\n\nconst COMMON_AUTHORITY: string = 'https://login.microsoftonline.com/common/';\n\n/**\n * Microsoft Authentication using MSAL v2: https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-browser\n */\nexport class MicrosoftLoginProvider extends BaseLoginProvider {\n private _instance: MSALClientApplication;\n public static readonly PROVIDER_ID: string = 'MICROSOFT';\n\n private initOptions: MicrosoftOptions = {\n authority: COMMON_AUTHORITY,\n scopes: ['openid', 'email', 'profile', 'User.Read'],\n knownAuthorities: [],\n protocolMode: ProtocolMode.AAD,\n clientCapabilities: [],\n cacheLocation: 'sessionStorage'\n };\n\n constructor(\n private clientId: string,\n initOptions?: MicrosoftOptions\n ) {\n super();\n\n this.initOptions = {\n ...this.initOptions,\n ...initOptions\n };\n }\n\n initialize(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.loadScript(\n MicrosoftLoginProvider.PROVIDER_ID,\n 'https://alcdn.msauth.net/browser/2.13.1/js/msal-browser.js',\n () => {\n try {\n const config = {\n auth: {\n clientId: this.clientId,\n redirectUri: this.initOptions.redirect_uri ?? location.origin,\n authority: this.initOptions.authority,\n knownAuthorities: this.initOptions.knownAuthorities,\n protocolMode: this.initOptions.protocolMode,\n clientCapabilities: this.initOptions.clientCapabilities\n },\n cache: !this.initOptions.cacheLocation ? null : {\n cacheLocation: this.initOptions.cacheLocation\n }\n };\n\n this._instance = new msal.PublicClientApplication(config);\n resolve();\n } catch (e) {\n reject(e);\n }\n }\n );\n });\n }\n\n private getSocialUser(loginResponse): Promise<SocialUser> {\n return new Promise<SocialUser>((resolve, reject) => {\n //After login, use Microsoft Graph API to get user info\n let meRequest = new XMLHttpRequest();\n meRequest.onreadystatechange = () => {\n if (meRequest.readyState == 4) {\n try {\n if (meRequest.status == 200) {\n let userInfo = <MSGraphUserInfo>JSON.parse(meRequest.responseText);\n\n let user: SocialUser = new SocialUser();\n user.provider = MicrosoftLoginProvider.PROVIDER_ID;\n user.id = loginResponse.idToken;\n user.authToken = loginResponse.accessToken;\n user.name = loginResponse.idTokenClaims.name;\n user.email = loginResponse.account.username;\n user.idToken = loginResponse.idToken;\n user.response = loginResponse;\n user.firstName = userInfo.givenName;\n user.lastName = userInfo.surname;\n\n resolve(user);\n } else {\n reject(`Error retrieving user info: ${meRequest.status}`);\n }\n } catch (err) {\n reject(err);\n }\n }\n };\n\n //Microsoft Graph ME Endpoint: https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http\n meRequest.open('GET', 'https://graph.microsoft.com/v1.0/me');\n meRequest.setRequestHeader('Authorization', `Bearer ${loginResponse.accessToken}`);\n try {\n meRequest.send();\n } catch (err) {\n reject(err);\n }\n });\n }\n\n async getLoginStatus(): Promise<SocialUser> {\n const accounts = this._instance.getAllAccounts();\n if (accounts?.length > 0) {\n const loginResponse = await this._instance.ssoSilent({\n scopes: this.initOptions.scopes,\n loginHint: accounts[0].username\n });\n return await this.getSocialUser(loginResponse);\n } else {\n throw `No user is currently logged in with ${MicrosoftLoginProvider.PROVIDER_ID}`;\n }\n }\n\n async signIn(): Promise<SocialUser> {\n const loginResponse = await this._instance.loginPopup({\n scopes: this.initOptions.scopes,\n prompt: this.initOptions.prompt,\n });\n return await this.getSocialUser(loginResponse);\n }\n\n async signOut(revoke?: boolean): Promise<void> {\n const accounts = this._instance.getAllAccounts();\n if (accounts?.length > 0) {\n await this._instance.logoutPopup({\n account: accounts[0],\n postLogoutRedirectUri: this.initOptions.logout_redirect_uri ?? this.initOptions.redirect_uri ?? location.href\n })\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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