@delon/auth
Version:
Simple user authentication, support Json Web Token & Simple Token.
1 lines • 46.3 kB
Source Map (JSON)
{"version":3,"file":"auth.mjs","sources":["../../../../packages/auth/src/auth.config.ts","../../../../packages/auth/src/store/local-storage.service.ts","../../../../packages/auth/src/store/interface.ts","../../../../packages/auth/src/token/token.service.ts","../../../../packages/auth/src/token/interface.ts","../../../../packages/auth/src/social/social.service.ts","../../../../packages/auth/src/store/memory.service.ts","../../../../packages/auth/src/store/session-storage.service.ts","../../../../packages/auth/src/store/cookie-storage.service.ts","../../../../packages/auth/src/token/helper.ts","../../../../packages/auth/src/token/jwt/jwt.helper.ts","../../../../packages/auth/src/token/jwt/jwt.model.ts","../../../../packages/auth/src/token/jwt/jwt.guard.ts","../../../../packages/auth/src/token.ts","../../../../packages/auth/src/token/base.interceptor.ts","../../../../packages/auth/src/token/jwt/jwt.interceptor.ts","../../../../packages/auth/src/token/simple/simple.guard.ts","../../../../packages/auth/src/token/simple/simple.interceptor.ts","../../../../packages/auth/src/token/simple/simple.model.ts","../../../../packages/auth/src/provide.ts","../../../../packages/auth/auth.ts"],"sourcesContent":["import type { AlainAuthConfig, AlainConfigService } from '@delon/util/config';\n\nexport const AUTH_DEFAULT_CONFIG: AlainAuthConfig = {\n store_key: `_token`,\n token_invalid_redirect: true,\n token_exp_offset: 10,\n token_send_key: `token`,\n token_send_template: '${token}',\n token_send_place: 'header',\n login_url: '/login',\n refreshTime: 3000,\n refreshOffset: 6000,\n ignores: [/\\/assets\\//]\n};\n\nexport function mergeConfig(srv: AlainConfigService): AlainAuthConfig {\n return srv.merge('auth', AUTH_DEFAULT_CONFIG)!;\n}\n","import { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\nexport function DA_STORE_TOKEN_LOCAL_FACTORY(): IStore {\n return new LocalStorageStore();\n}\n\n/**\n * `localStorage` storage, **not lost after closing the browser**.\n *\n * ```ts\n provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),\n provideAuth(withLocalStorage()),\n * ```\n */\nexport class LocalStorageStore implements IStore {\n get(key: string): ITokenModel {\n return JSON.parse(localStorage.getItem(key) ?? '{}') ?? {};\n }\n\n set(key: string, value: ITokenModel | null): boolean {\n localStorage.setItem(key, JSON.stringify(value));\n return true;\n }\n\n remove(key: string): void {\n localStorage.removeItem(key);\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { DA_STORE_TOKEN_LOCAL_FACTORY } from './local-storage.service';\nimport { ITokenModel } from '../token/interface';\n\nexport const DA_STORE_TOKEN = new InjectionToken<IStore>('AUTH_STORE_TOKEN', {\n providedIn: 'root',\n factory: DA_STORE_TOKEN_LOCAL_FACTORY\n});\n\nexport interface IStore {\n get(key: string): ITokenModel;\n\n set(key: string, value: ITokenModel): boolean;\n\n remove(key: string): void;\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, interval, Observable, Subject, Subscription, filter, map, share } from 'rxjs';\n\nimport { AlainAuthConfig, AlainConfigService } from '@delon/util/config';\n\nimport { mergeConfig } from '../auth.config';\nimport { AuthReferrer, ITokenModel, ITokenService } from './interface';\nimport { DA_STORE_TOKEN } from '../store/interface';\n\nexport function DA_SERVICE_TOKEN_FACTORY(): ITokenService {\n return new TokenService();\n}\n\n/**\n * 维护Token信息服务,[在线文档](https://ng-alain.com/auth)\n */\n@Injectable()\nexport class TokenService implements ITokenService, OnDestroy {\n private readonly store = inject(DA_STORE_TOKEN);\n private readonly cogSrv = inject(AlainConfigService);\n private refresh$ = new Subject<ITokenModel>();\n private change$ = new BehaviorSubject<ITokenModel | null>(null);\n private interval$?: Subscription;\n private _referrer: AuthReferrer = {};\n private _options: AlainAuthConfig;\n\n constructor() {\n this._options = mergeConfig(this.cogSrv);\n }\n\n get refresh(): Observable<ITokenModel> {\n this.builderRefresh();\n return this.refresh$.pipe(share());\n }\n\n get login_url(): string | undefined {\n return this._options.login_url;\n }\n\n get referrer(): AuthReferrer {\n return this._referrer;\n }\n\n get options(): AlainAuthConfig {\n return this._options;\n }\n\n set(data: ITokenModel): boolean {\n const res = this.store.set(this._options.store_key!, data);\n this.change$.next(data);\n return res;\n }\n\n get(type?: any): any;\n get<T extends ITokenModel>(type?: new () => T): T;\n get<T extends ITokenModel>(type?: new () => T): T {\n const data = this.store.get(this._options.store_key!);\n return type ? (Object.assign(new type(), data) as T) : (data as T);\n }\n\n clear(options: { onlyToken: boolean } = { onlyToken: false }): void {\n let data: ITokenModel | null = null;\n if (options.onlyToken === true) {\n data = this.get() as ITokenModel;\n data.token = ``;\n this.set(data);\n } else {\n this.store.remove(this._options.store_key!);\n }\n this.change$.next(data);\n }\n\n change(): Observable<ITokenModel | null> {\n return this.change$.pipe(share());\n }\n\n private builderRefresh(): void {\n const { refreshTime, refreshOffset } = this._options;\n this.cleanRefresh();\n this.interval$ = interval(refreshTime)\n .pipe(\n map(() => {\n const item = this.get() as ITokenModel;\n const expired = item.expired ?? item.exp ?? 0;\n if (expired <= 0) {\n return null;\n }\n\n const curTime = new Date().valueOf() + refreshOffset!;\n return expired <= curTime ? item : null;\n }),\n filter(v => v != null)\n )\n .subscribe(res => this.refresh$.next(res!));\n }\n\n private cleanRefresh(): void {\n if (this.interval$ && !this.interval$.closed) {\n this.interval$.unsubscribe();\n }\n }\n\n ngOnDestroy(): void {\n this.cleanRefresh();\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { AlainAuthConfig } from '@delon/util/config';\n\nimport { DA_SERVICE_TOKEN_FACTORY } from './token.service';\n\nexport const DA_SERVICE_TOKEN = new InjectionToken<ITokenService>('DA_SERVICE_TOKEN', {\n providedIn: 'root',\n factory: DA_SERVICE_TOKEN_FACTORY\n});\n\nexport interface ITokenModel {\n [key: string]: any;\n\n token: string | null | undefined;\n\n /**\n * 过期时间,单位:ms\n * - 不管Simple、JWT模式都必须指定\n */\n expired?: number;\n}\n\nexport interface AuthReferrer {\n url?: string | null | undefined;\n}\n\nexport interface ITokenService {\n /**\n * 授权失败后跳转路由路径(支持外部链接地址),通过设置[全局配置](https://ng-alain.com/docs/global-config)来改变\n */\n readonly login_url: string | undefined;\n\n /**\n * 当前请求页面的来源页面的地址\n */\n readonly referrer?: AuthReferrer;\n\n readonly options: AlainAuthConfig;\n\n /**\n * 订阅刷新,订阅时会自动产生一个定时器,每隔一段时间进行一些校验\n * - **注意** 会多次触发,请务必做好业务判断\n */\n readonly refresh: Observable<ITokenModel>;\n\n /**\n * 设置 Token 信息,当用户 Token 发生变动时都需要调用此方法重新刷新\n * - 如果需要监听过期,需要传递 `expired` 值\n */\n set(data: ITokenModel | null): boolean;\n\n /**\n * 获取Token,形式包括:\n * - `get()` 获取 Simple Token\n * - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token\n */\n get(type?: any): ITokenModel | null;\n\n /**\n * 获取Token,形式包括:\n * - `get()` 获取 Simple Token\n * - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token\n */\n get<T extends ITokenModel>(type?: any): T;\n\n /**\n * 清除 Token 信息,当用户退出登录时调用。\n * ```\n * // 清除所有 Token 信息\n * tokenService.clear();\n * // 只清除 token 字段\n * tokenService.clear({ onlyToken: true });\n * ```\n */\n clear(options?: { onlyToken: boolean }): void;\n\n /**\n * 订阅 Token 对象变更通知\n */\n change(): Observable<ITokenModel | null>;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, OnDestroy, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, Observer } from 'rxjs';\n\nimport { DA_SERVICE_TOKEN, ITokenModel } from '../token/interface';\n\nconst OPENTYPE = '_delonAuthSocialType';\nconst HREFCALLBACK = '_delonAuthSocialCallbackByHref';\n\nexport type SocialOpenType = 'href' | 'window';\n\n@Injectable()\nexport class SocialService implements OnDestroy {\n private readonly tokenService = inject(DA_SERVICE_TOKEN);\n private readonly doc = inject(DOCUMENT);\n private readonly router = inject(Router);\n\n private _win: Window | null = null;\n private _winTime: any;\n private observer!: Observer<ITokenModel | null>;\n\n /**\n * 使用窗体打开授权页,返回值是 `Observable<ITokenModel>` 用于订阅授权后返回的结果\n *\n * @param url 获取授权地址\n * @param callback 回调路由地址\n * @param options.windowFeatures 等同 `window.open` 的 `features` 参数值\n */\n login(\n url: string,\n callback?: string,\n options?: {\n type?: 'window';\n windowFeatures?: string;\n }\n ): Observable<ITokenModel>;\n\n /**\n * 跳转至授权页\n *\n * @param url 获取授权地址\n * @param callback 回调路由地址\n */\n login(\n url: string,\n callback?: string,\n options?: {\n type?: 'href';\n }\n ): void;\n\n /**\n * 跳转至登录页,若为 `type=window` 时,返回值是 `Observable<ITokenModel>`\n *\n * @param url 获取授权地址\n * @param callback 当 `type=href` 成功时的回调路由地址\n * @param options.type 打开方式,默认 `window`\n * @param options.windowFeatures 等同 `window.open` 的 `features` 参数值\n */\n login(\n url: string,\n callback: string = '/',\n options: {\n type?: SocialOpenType;\n windowFeatures?: string;\n } = {}\n ): Observable<ITokenModel | null> | void {\n options = {\n type: 'window',\n windowFeatures: 'location=yes,height=570,width=520,scrollbars=yes,status=yes',\n ...options\n };\n localStorage.setItem(OPENTYPE, options.type!);\n localStorage.setItem(HREFCALLBACK, callback);\n if (options.type === 'href') {\n this.doc.location.href = url;\n return;\n }\n\n this._win = window.open(url, '_blank', options.windowFeatures);\n this._winTime = setInterval(() => {\n if (this._win && this._win.closed) {\n this.ngOnDestroy();\n\n let model = this.tokenService.get();\n if (model && !model.token) model = null;\n\n // 触发变更通知\n if (model) {\n this.tokenService.set(model);\n }\n\n this.observer.next(model);\n this.observer.complete();\n }\n }, 100);\n return new Observable((observer: Observer<ITokenModel | null>) => {\n this.observer = observer;\n });\n }\n\n /**\n * 授权成功后的回调处理\n *\n * @param rawData 指定回调认证信息,为空时从根据当前URL解析\n */\n callback(rawData?: ITokenModel | string | null): ITokenModel {\n // from uri\n if (!rawData && this.router.url.indexOf('?') === -1) {\n throw new Error(`url muse contain a ?`);\n }\n // parse\n let data: ITokenModel = { token: `` };\n if (typeof rawData === 'string') {\n const rightUrl = rawData.split('?')[1].split('#')[0];\n data = this.router.parseUrl(`./?${rightUrl}`).queryParams as ITokenModel;\n } else {\n data = rawData as ITokenModel;\n }\n\n if (!data || !data.token) throw new Error(`invalide token data`);\n this.tokenService.set(data);\n\n const url = localStorage.getItem(HREFCALLBACK) ?? '/';\n localStorage.removeItem(HREFCALLBACK);\n const type = localStorage.getItem(OPENTYPE);\n localStorage.removeItem(OPENTYPE);\n if (type === 'window') {\n window.close();\n } else {\n this.router.navigateByUrl(url);\n }\n\n return data;\n }\n\n ngOnDestroy(): void {\n clearInterval(this._winTime);\n this._winTime = null;\n }\n}\n","import { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\n/**\n * 内存存储,关掉浏览器标签后**丢失**。\n */\nexport class MemoryStore implements IStore {\n private cache: Record<string, ITokenModel | null> = {};\n\n get(key: string): ITokenModel {\n return this.cache[key] ?? ({} as ITokenModel);\n }\n\n set(key: string, value: ITokenModel): boolean {\n this.cache[key] = value;\n return true;\n }\n\n remove(key: string): void {\n this.cache[key] = null;\n }\n}\n","import { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\n/**\n * `sessionStorage` storage, **lost after closing the browser**.\n *\n * ```ts\n provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),\n provideAuth(withSessionStorage()),\n * ```\n */\nexport class SessionStorageStore implements IStore {\n get(key: string): ITokenModel {\n return JSON.parse(sessionStorage.getItem(key) ?? '{}') ?? {};\n }\n\n set(key: string, value: ITokenModel | null): boolean {\n sessionStorage.setItem(key, JSON.stringify(value));\n return true;\n }\n\n remove(key: string): void {\n sessionStorage.removeItem(key);\n }\n}\n","import { inject } from '@angular/core';\n\nimport { CookieService } from '@delon/util/browser';\n\nimport { IStore } from './interface';\nimport { ITokenModel } from '../token/interface';\n\n/**\n * `cookie` storage\n *\n * ```ts\n provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),\n provideAuth(withCookie()),\n * ```\n */\nexport class CookieStorageStore implements IStore {\n private readonly srv = inject(CookieService);\n\n get(key: string): ITokenModel {\n try {\n return JSON.parse(this.srv.get(key) ?? '{}');\n } catch (ex) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.error(`CookieStorageStore: Invalid key-value format ${key}`, ex);\n }\n return {} as ITokenModel;\n }\n }\n\n set(key: string, value: ITokenModel | null | undefined): boolean {\n const expires = (value?.expired ?? 0) / 1e3;\n this.srv.put(key, JSON.stringify(value ?? {}), { expires });\n return true;\n }\n\n remove(key: string): void {\n this.srv.remove(key);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { AlainAuthConfig } from '@delon/util/config';\n\nimport { DA_SERVICE_TOKEN, ITokenService } from './interface';\nimport { JWTTokenModel } from './jwt/jwt.model';\nimport { SimpleTokenModel } from './simple/simple.model';\n\nexport function CheckSimple(model: SimpleTokenModel | null): boolean {\n return model != null && typeof model.token === 'string' && model.token.length > 0;\n}\n\nexport function CheckJwt(model: JWTTokenModel, offset: number): boolean {\n try {\n return model != null && !!model.token && !model.isExpired(offset);\n } catch (err: unknown) {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n console.warn(`${(err as { message: string }).message}, jump to login_url`);\n }\n return false;\n }\n}\n\nexport function ToLogin(options: AlainAuthConfig, url?: string): void {\n const router = inject(Router);\n const token = inject(DA_SERVICE_TOKEN) as ITokenService;\n const doc = inject(DOCUMENT);\n token.referrer!.url = url ?? router.url;\n if (options.token_invalid_redirect === true) {\n setTimeout(() => {\n if (/^https?:\\/\\//g.test(options.login_url!)) {\n doc.location.href = options.login_url as string;\n } else {\n router.navigate([options.login_url]);\n }\n });\n }\n}\n","export function urlBase64Decode(str: string): string {\n let output = str.replace(/-/g, '+').replace(/_/g, '/');\n switch (output.length % 4) {\n case 0: {\n break;\n }\n case 2: {\n output += '==';\n break;\n }\n case 3: {\n output += '=';\n break;\n }\n default: {\n throw new Error(`'atob' failed: The string to be decoded is not correctly encoded.`);\n }\n }\n return b64DecodeUnicode(output);\n}\n\nfunction b64decode(str: string): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n let output = '';\n\n str = String(str).replace(/=+$/, '');\n\n for (\n // initialize result and counters\n\n let bc = 0, bs: any, buffer: any, idx = 0;\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? bs * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4)\n ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n return output;\n}\n\n// https://developer.mozilla.org/en/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\nfunction b64DecodeUnicode(str: string): string {\n return decodeURIComponent(\n Array.prototype.map\n .call(b64decode(str), (c: string) => {\n return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`;\n })\n .join('')\n );\n}\n","import { ITokenModel } from '../interface';\nimport { urlBase64Decode } from './jwt.helper';\n\nexport interface JWT {\n /**\n * Issuerd\n */\n iss: string;\n /**\n * Issued At\n */\n iat: string;\n /**\n * Subject\n */\n sub: string;\n /**\n * Expiration Time\n */\n exp: number;\n /**\n * Audience\n */\n aud: string;\n /**\n * Not Before\n */\n nbf: string;\n /**\n * JWT ID\n */\n jti: string;\n\n [key: string]: any;\n [key: number]: any;\n}\n\nexport class JWTTokenModel implements ITokenModel {\n [key: string]: any;\n\n token: string | null | undefined;\n\n expired?: number;\n\n /**\n * 获取载荷信息\n */\n get payload(): JWT {\n const parts = (this.token ?? '').split('.');\n if (parts.length !== 3) throw new Error('JWT must have 3 parts');\n\n const decoded = urlBase64Decode(parts[1]);\n return JSON.parse(decoded);\n }\n\n /**\n * 获取过期时间戳(单位:ms)\n */\n get exp(): number | null {\n const decoded = this.payload;\n if (!Object.prototype.hasOwnProperty.call(decoded, 'exp')) return null;\n const date = new Date(0);\n date.setUTCSeconds(decoded.exp);\n return date.valueOf();\n }\n\n /**\n * 检查Token是否过期,当`payload` 包含 `exp` 字段时有效,若无 `exp` 字段直接返回 `null`\n *\n * @param offsetSeconds 偏移量\n */\n isExpired(offsetSeconds: number = 0): boolean | null {\n const exp = this.exp;\n if (exp == null) return null;\n\n return !(exp > new Date().valueOf() + offsetSeconds * 1000);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn, CanMatchFn } from '@angular/router';\n\nimport { CheckJwt, ToLogin } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { JWTTokenModel } from './jwt.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthJWTGuardService {\n private readonly srv = inject(DA_SERVICE_TOKEN);\n\n process(url?: string): boolean {\n const cog = this.srv.options;\n const res = CheckJwt(this.srv.get<JWTTokenModel>(JWTTokenModel), cog.token_exp_offset!);\n if (!res) {\n ToLogin(cog, url);\n }\n return res;\n }\n}\n\n/**\n * JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n * path: 'home',\n * canActivate: [ authJWTCanActivate ],\n * data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authJWTCanActivate: CanActivateFn = (_, state) => inject(AuthJWTGuardService).process(state.url);\n\n/**\n * JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n * path: 'home',\n * canActivateChild: [ authJWTCanActivateChild ],\n * data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authJWTCanActivateChild: CanActivateChildFn = (_, state) => inject(AuthJWTGuardService).process(state.url);\n\n/**\n * JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n * path: 'home',\n * canMatch: [ authJWTCanMatch ],\n * data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authJWTCanMatch: CanMatchFn = route => inject(AuthJWTGuardService).process(route.path);\n","import { HttpContextToken } from '@angular/common/http';\n\n/**\n * Whether to allow anonymous login\n *\n * 是否允许匿名登录\n *\n * @example\n * this.http.post(`login`, {\n * name: 'cipchk', pwd: '123456'\n * }, {\n * context: new HttpContext().set(ALLOW_ANONYMOUS, true)\n * })\n */\nexport const ALLOW_ANONYMOUS = new HttpContextToken(() => false);\n","import { HttpErrorResponse, HttpEvent, HttpRequest } from '@angular/common/http';\nimport { Observable, Observer } from 'rxjs';\n\nimport { AlainAuthConfig } from '@delon/util/config';\n\nimport { ALLOW_ANONYMOUS } from '../token';\nimport { ToLogin } from './helper';\n\nexport function isAnonymous(req: HttpRequest<unknown>, options: AlainAuthConfig): boolean {\n if (req.context.get(ALLOW_ANONYMOUS)) return true;\n if (Array.isArray(options.ignores)) {\n for (const item of options.ignores) {\n if (item.test(req.url)) return true;\n }\n }\n return false;\n}\n\nexport function throwErr(req: HttpRequest<unknown>, options: AlainAuthConfig): Observable<HttpEvent<unknown>> {\n ToLogin(options);\n\n // Interrupt Http request, so need to generate a new Observable\n return new Observable((observer: Observer<HttpEvent<any>>) => {\n let statusText = '';\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n statusText = `来自 @delon/auth 的拦截,所请求URL未授权,若是登录API可加入 new HttpContext().set(ALLOW_ANONYMOUS, true) 来表示忽略校验,更多方法请参考: https://ng-alain.com/auth/getting-started#AlainAuthConfig\\nThe interception from @delon/auth, the requested URL is not authorized. If the login API can add new HttpContext().set(ALLOW_ANONYMOUS, true) to ignore the check, please refer to: https://ng-alain.com/auth/getting-started#AlainAuthConfig`;\n }\n const res = new HttpErrorResponse({\n url: req.url,\n headers: req.headers,\n status: 401,\n statusText\n });\n observer.error(res);\n });\n}\n","import { HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { AlainConfigService } from '@delon/util/config';\n\nimport { mergeConfig } from '../../auth.config';\nimport { isAnonymous, throwErr } from '../base.interceptor';\nimport { CheckJwt } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { JWTTokenModel } from './jwt.model';\n\nfunction newReq(req: HttpRequest<unknown>, model: JWTTokenModel): HttpRequest<unknown> {\n return req.clone({\n setHeaders: {\n Authorization: `Bearer ${model.token}`\n }\n });\n}\n\nexport const authJWTInterceptor: HttpInterceptorFn = (req, next) => {\n const options = mergeConfig(inject(AlainConfigService));\n\n if (isAnonymous(req, options)) return next(req);\n\n const model = inject(DA_SERVICE_TOKEN).get<JWTTokenModel>(JWTTokenModel);\n if (CheckJwt(model, options.token_exp_offset!)) return next(newReq(req, model));\n\n return throwErr(req, options);\n};\n","import { Injectable, inject } from '@angular/core';\nimport { CanActivateChildFn, CanActivateFn, CanMatchFn } from '@angular/router';\n\nimport { CheckSimple, ToLogin } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { SimpleTokenModel } from './simple.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthSimpleGuardService {\n private readonly srv = inject(DA_SERVICE_TOKEN);\n\n process(url?: string): boolean {\n const res = CheckSimple(this.srv.get() as SimpleTokenModel);\n if (!res) {\n ToLogin(this.srv.options, url);\n }\n return res;\n }\n}\n\n/**\n * Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n * path: 'home',\n * canActivate: [ authSimpleCanActivate ],\n * data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authSimpleCanActivate: CanActivateFn = (_, state) => inject(AuthSimpleGuardService).process(state.url);\n\n/**\n * Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n * path: 'home',\n * canActivateChild: [ authSimpleCanActivateChild ],\n * data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authSimpleCanActivateChild: CanActivateChildFn = (_, state) =>\n inject(AuthSimpleGuardService).process(state.url);\n\n/**\n * Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).\n *\n * ```ts\n * data: {\n * path: 'home',\n * canMatch: [ authSimpleCanMatch ],\n * data: { guard: 'user1' }\n * }\n * ```\n */\nexport const authSimpleCanMatch: CanMatchFn = route => inject(AuthSimpleGuardService).process(route.path);\n","import { HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { AlainAuthConfig, AlainConfigService } from '@delon/util/config';\n\nimport { mergeConfig } from '../../auth.config';\nimport { isAnonymous, throwErr } from '../base.interceptor';\nimport { CheckSimple } from '../helper';\nimport { DA_SERVICE_TOKEN } from '../interface';\nimport { SimpleTokenModel } from './simple.model';\n\nfunction newReq(req: HttpRequest<unknown>, model: SimpleTokenModel, options: AlainAuthConfig): HttpRequest<unknown> {\n const { token_send_template, token_send_key } = options;\n const token = token_send_template!.replace(/\\$\\{([\\w]+)\\}/g, (_: string, g) => model[g]);\n switch (options.token_send_place) {\n case 'header':\n // eslint-disable-next-line no-case-declarations\n const obj: any = {};\n obj[token_send_key!] = token;\n req = req.clone({\n setHeaders: obj\n });\n break;\n case 'body': {\n const body: any = req.body ?? {};\n body[token_send_key!] = token;\n req = req.clone({\n body\n });\n break;\n }\n case 'url':\n req = req.clone({\n params: req.params.append(token_send_key!, token)\n });\n break;\n }\n return req;\n}\n\nexport const authSimpleInterceptor: HttpInterceptorFn = (req, next) => {\n const options = mergeConfig(inject(AlainConfigService));\n\n if (isAnonymous(req, options)) return next(req);\n\n const model = inject(DA_SERVICE_TOKEN).get() as SimpleTokenModel;\n if (CheckSimple(model)) return next(newReq(req, model, options));\n\n return throwErr(req, options);\n};\n","import { ITokenModel } from '../interface';\n\nexport class SimpleTokenModel implements ITokenModel {\n [key: string]: any;\n\n token: string | null | undefined;\n\n expired?: number;\n}\n","import { EnvironmentProviders, Provider, makeEnvironmentProviders } from '@angular/core';\n\nimport { CookieService } from '@delon/util/browser';\n\nimport { CookieStorageStore, DA_STORE_TOKEN, LocalStorageStore, MemoryStore, SessionStorageStore } from './store';\n\nexport enum AuthFeatureKind {\n Store\n}\n\nexport interface AuthFeature<KindT extends AuthFeatureKind> {\n ɵkind: KindT;\n ɵproviders: Provider[];\n}\n\nfunction makeAuthFeature<KindT extends AuthFeatureKind>(kind: KindT, providers: Provider[]): AuthFeature<KindT> {\n return {\n ɵkind: kind,\n ɵproviders: providers\n };\n}\n\n/**\n * Configures authentication process service to be available for injection.\n *\n * @see {@link withCookie}\n * @see {@link withLocalStorage}\n * @see {@link withSessionStorage}\n */\nexport function provideAuth(store?: AuthFeature<AuthFeatureKind.Store>): EnvironmentProviders {\n return makeEnvironmentProviders([(store ?? withLocalStorage()).ɵproviders]);\n}\n\n/** `cookie` storage */\nexport function withCookie(): AuthFeature<AuthFeatureKind.Store> {\n return makeAuthFeature(AuthFeatureKind.Store, [\n { provide: DA_STORE_TOKEN, useClass: CookieStorageStore, deps: [CookieService] }\n ]);\n}\n\n/** `localStorage` storage, **not lost after closing the browser**. */\nexport function withLocalStorage(): AuthFeature<AuthFeatureKind.Store> {\n return makeAuthFeature(AuthFeatureKind.Store, [{ provide: DA_STORE_TOKEN, useClass: LocalStorageStore }]);\n}\n\n/** `sessionStorage` storage, **lost after closing the browser**. */\nexport function withSessionStorage(): AuthFeature<AuthFeatureKind.Store> {\n return makeAuthFeature(AuthFeatureKind.Store, [{ provide: DA_STORE_TOKEN, useClass: SessionStorageStore }]);\n}\n\n/** Memory storage, **lost after closing the browser tab**. */\nexport function withMemoryStorage(): AuthFeature<AuthFeatureKind.Store> {\n return makeAuthFeature(AuthFeatureKind.Store, [{ provide: DA_STORE_TOKEN, useClass: MemoryStore }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["newReq"],"mappings":"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"}