@delon/auth 19.2.0 → 20.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/auth.mjs +17 -17
- package/fesm2022/auth.mjs.map +1 -1
- package/index.d.ts +397 -1
- package/package.json +2 -2
- package/src/auth.config.d.ts +0 -3
- package/src/index.d.ts +0 -6
- package/src/provide.d.ts +0 -24
- package/src/social/social.service.d.ts +0 -42
- package/src/store/cookie-storage.service.d.ts +0 -16
- package/src/store/index.d.ts +0 -5
- package/src/store/interface.d.ts +0 -8
- package/src/store/local-storage.service.d.ts +0 -16
- package/src/store/memory.service.d.ts +0 -11
- package/src/store/session-storage.service.d.ts +0 -15
- package/src/token/base.interceptor.d.ts +0 -5
- package/src/token/helper.d.ts +0 -6
- package/src/token/index.d.ts +0 -5
- package/src/token/interface.d.ts +0 -65
- package/src/token/jwt/index.d.ts +0 -4
- package/src/token/jwt/jwt.guard.d.ts +0 -44
- package/src/token/jwt/jwt.helper.d.ts +0 -1
- package/src/token/jwt/jwt.interceptor.d.ts +0 -2
- package/src/token/jwt/jwt.model.d.ts +0 -52
- package/src/token/simple/index.d.ts +0 -3
- package/src/token/simple/simple.guard.d.ts +0 -44
- package/src/token/simple/simple.interceptor.d.ts +0 -2
- package/src/token/simple/simple.model.d.ts +0 -6
- package/src/token/token.service.d.ts +0 -34
- package/src/token.d.ts +0 -14
package/fesm2022/auth.mjs
CHANGED
|
@@ -3,7 +3,6 @@ import * as i0 from '@angular/core';
|
|
|
3
3
|
import { InjectionToken, inject, Injectable, makeEnvironmentProviders } from '@angular/core';
|
|
4
4
|
import { Router } from '@angular/router';
|
|
5
5
|
import { Subject, BehaviorSubject, share, interval, map, filter, Observable } from 'rxjs';
|
|
6
|
-
import * as i1 from '@delon/util/config';
|
|
7
6
|
import { AlainConfigService } from '@delon/util/config';
|
|
8
7
|
import { CookieService } from '@delon/util/browser';
|
|
9
8
|
import { HttpContextToken, HttpErrorResponse } from '@angular/common/http';
|
|
@@ -54,20 +53,21 @@ const DA_STORE_TOKEN = new InjectionToken('AUTH_STORE_TOKEN', {
|
|
|
54
53
|
});
|
|
55
54
|
|
|
56
55
|
function DA_SERVICE_TOKEN_FACTORY() {
|
|
57
|
-
return new TokenService(
|
|
56
|
+
return new TokenService();
|
|
58
57
|
}
|
|
59
58
|
/**
|
|
60
59
|
* 维护Token信息服务,[在线文档](https://ng-alain.com/auth)
|
|
61
60
|
*/
|
|
62
61
|
class TokenService {
|
|
63
62
|
store = inject(DA_STORE_TOKEN);
|
|
63
|
+
cogSrv = inject(AlainConfigService);
|
|
64
64
|
refresh$ = new Subject();
|
|
65
65
|
change$ = new BehaviorSubject(null);
|
|
66
66
|
interval$;
|
|
67
67
|
_referrer = {};
|
|
68
68
|
_options;
|
|
69
|
-
constructor(
|
|
70
|
-
this._options = mergeConfig(
|
|
69
|
+
constructor() {
|
|
70
|
+
this._options = mergeConfig(this.cogSrv);
|
|
71
71
|
}
|
|
72
72
|
get refresh() {
|
|
73
73
|
this.builderRefresh();
|
|
@@ -129,12 +129,12 @@ class TokenService {
|
|
|
129
129
|
ngOnDestroy() {
|
|
130
130
|
this.cleanRefresh();
|
|
131
131
|
}
|
|
132
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
133
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
132
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: TokenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
133
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: TokenService });
|
|
134
134
|
}
|
|
135
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: TokenService, decorators: [{
|
|
136
136
|
type: Injectable
|
|
137
|
-
}], ctorParameters: () => [
|
|
137
|
+
}], ctorParameters: () => [] });
|
|
138
138
|
|
|
139
139
|
const DA_SERVICE_TOKEN = new InjectionToken('DA_SERVICE_TOKEN', {
|
|
140
140
|
providedIn: 'root',
|
|
@@ -227,10 +227,10 @@ class SocialService {
|
|
|
227
227
|
clearInterval(this._winTime);
|
|
228
228
|
this._winTime = null;
|
|
229
229
|
}
|
|
230
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
231
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
230
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: SocialService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
231
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: SocialService });
|
|
232
232
|
}
|
|
233
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: SocialService, decorators: [{
|
|
234
234
|
type: Injectable
|
|
235
235
|
}] });
|
|
236
236
|
|
|
@@ -432,10 +432,10 @@ class AuthJWTGuardService {
|
|
|
432
432
|
}
|
|
433
433
|
return res;
|
|
434
434
|
}
|
|
435
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
436
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
435
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AuthJWTGuardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
436
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AuthJWTGuardService, providedIn: 'root' });
|
|
437
437
|
}
|
|
438
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
438
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AuthJWTGuardService, decorators: [{
|
|
439
439
|
type: Injectable,
|
|
440
440
|
args: [{ providedIn: 'root' }]
|
|
441
441
|
}] });
|
|
@@ -545,10 +545,10 @@ class AuthSimpleGuardService {
|
|
|
545
545
|
}
|
|
546
546
|
return res;
|
|
547
547
|
}
|
|
548
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
549
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
548
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AuthSimpleGuardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
549
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AuthSimpleGuardService, providedIn: 'root' });
|
|
550
550
|
}
|
|
551
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
551
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AuthSimpleGuardService, decorators: [{
|
|
552
552
|
type: Injectable,
|
|
553
553
|
args: [{ providedIn: 'root' }]
|
|
554
554
|
}] });
|
package/fesm2022/auth.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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(inject(AlainConfigService));\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 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(configSrv: AlainConfigService) {\n this._options = mergeConfig(configSrv);\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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"}
|
|
1
|
+
{"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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"}
|
package/index.d.ts
CHANGED
|
@@ -1 +1,397 @@
|
|
|
1
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, OnDestroy, Provider, EnvironmentProviders } from '@angular/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { AlainAuthConfig, AlainConfigService } from '@delon/util/config';
|
|
5
|
+
import { CanActivateFn, CanActivateChildFn, CanMatchFn } from '@angular/router';
|
|
6
|
+
import { HttpInterceptorFn, HttpRequest, HttpEvent, HttpContextToken } from '@angular/common/http';
|
|
7
|
+
|
|
8
|
+
declare const DA_SERVICE_TOKEN: InjectionToken<ITokenService>;
|
|
9
|
+
interface ITokenModel {
|
|
10
|
+
[key: string]: any;
|
|
11
|
+
token: string | null | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* 过期时间,单位:ms
|
|
14
|
+
* - 不管Simple、JWT模式都必须指定
|
|
15
|
+
*/
|
|
16
|
+
expired?: number;
|
|
17
|
+
}
|
|
18
|
+
interface AuthReferrer {
|
|
19
|
+
url?: string | null | undefined;
|
|
20
|
+
}
|
|
21
|
+
interface ITokenService {
|
|
22
|
+
/**
|
|
23
|
+
* 授权失败后跳转路由路径(支持外部链接地址),通过设置[全局配置](https://ng-alain.com/docs/global-config)来改变
|
|
24
|
+
*/
|
|
25
|
+
readonly login_url: string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* 当前请求页面的来源页面的地址
|
|
28
|
+
*/
|
|
29
|
+
readonly referrer?: AuthReferrer;
|
|
30
|
+
readonly options: AlainAuthConfig;
|
|
31
|
+
/**
|
|
32
|
+
* 订阅刷新,订阅时会自动产生一个定时器,每隔一段时间进行一些校验
|
|
33
|
+
* - **注意** 会多次触发,请务必做好业务判断
|
|
34
|
+
*/
|
|
35
|
+
readonly refresh: Observable<ITokenModel>;
|
|
36
|
+
/**
|
|
37
|
+
* 设置 Token 信息,当用户 Token 发生变动时都需要调用此方法重新刷新
|
|
38
|
+
* - 如果需要监听过期,需要传递 `expired` 值
|
|
39
|
+
*/
|
|
40
|
+
set(data: ITokenModel | null): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 获取Token,形式包括:
|
|
43
|
+
* - `get()` 获取 Simple Token
|
|
44
|
+
* - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token
|
|
45
|
+
*/
|
|
46
|
+
get(type?: any): ITokenModel | null;
|
|
47
|
+
/**
|
|
48
|
+
* 获取Token,形式包括:
|
|
49
|
+
* - `get()` 获取 Simple Token
|
|
50
|
+
* - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token
|
|
51
|
+
*/
|
|
52
|
+
get<T extends ITokenModel>(type?: any): T;
|
|
53
|
+
/**
|
|
54
|
+
* 清除 Token 信息,当用户退出登录时调用。
|
|
55
|
+
* ```
|
|
56
|
+
* // 清除所有 Token 信息
|
|
57
|
+
* tokenService.clear();
|
|
58
|
+
* // 只清除 token 字段
|
|
59
|
+
* tokenService.clear({ onlyToken: true });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
clear(options?: {
|
|
63
|
+
onlyToken: boolean;
|
|
64
|
+
}): void;
|
|
65
|
+
/**
|
|
66
|
+
* 订阅 Token 对象变更通知
|
|
67
|
+
*/
|
|
68
|
+
change(): Observable<ITokenModel | null>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
type SocialOpenType = 'href' | 'window';
|
|
72
|
+
declare class SocialService implements OnDestroy {
|
|
73
|
+
private readonly tokenService;
|
|
74
|
+
private readonly doc;
|
|
75
|
+
private readonly router;
|
|
76
|
+
private _win;
|
|
77
|
+
private _winTime;
|
|
78
|
+
private observer;
|
|
79
|
+
/**
|
|
80
|
+
* 使用窗体打开授权页,返回值是 `Observable<ITokenModel>` 用于订阅授权后返回的结果
|
|
81
|
+
*
|
|
82
|
+
* @param url 获取授权地址
|
|
83
|
+
* @param callback 回调路由地址
|
|
84
|
+
* @param options.windowFeatures 等同 `window.open` 的 `features` 参数值
|
|
85
|
+
*/
|
|
86
|
+
login(url: string, callback?: string, options?: {
|
|
87
|
+
type?: 'window';
|
|
88
|
+
windowFeatures?: string;
|
|
89
|
+
}): Observable<ITokenModel>;
|
|
90
|
+
/**
|
|
91
|
+
* 跳转至授权页
|
|
92
|
+
*
|
|
93
|
+
* @param url 获取授权地址
|
|
94
|
+
* @param callback 回调路由地址
|
|
95
|
+
*/
|
|
96
|
+
login(url: string, callback?: string, options?: {
|
|
97
|
+
type?: 'href';
|
|
98
|
+
}): void;
|
|
99
|
+
/**
|
|
100
|
+
* 授权成功后的回调处理
|
|
101
|
+
*
|
|
102
|
+
* @param rawData 指定回调认证信息,为空时从根据当前URL解析
|
|
103
|
+
*/
|
|
104
|
+
callback(rawData?: ITokenModel | string | null): ITokenModel;
|
|
105
|
+
ngOnDestroy(): void;
|
|
106
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SocialService, never>;
|
|
107
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SocialService>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
declare const DA_STORE_TOKEN: InjectionToken<IStore>;
|
|
111
|
+
interface IStore {
|
|
112
|
+
get(key: string): ITokenModel;
|
|
113
|
+
set(key: string, value: ITokenModel): boolean;
|
|
114
|
+
remove(key: string): void;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
declare function DA_STORE_TOKEN_LOCAL_FACTORY(): IStore;
|
|
118
|
+
/**
|
|
119
|
+
* `localStorage` storage, **not lost after closing the browser**.
|
|
120
|
+
*
|
|
121
|
+
* ```ts
|
|
122
|
+
provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),
|
|
123
|
+
provideAuth(withLocalStorage()),
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
declare class LocalStorageStore implements IStore {
|
|
127
|
+
get(key: string): ITokenModel;
|
|
128
|
+
set(key: string, value: ITokenModel | null): boolean;
|
|
129
|
+
remove(key: string): void;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 内存存储,关掉浏览器标签后**丢失**。
|
|
134
|
+
*/
|
|
135
|
+
declare class MemoryStore implements IStore {
|
|
136
|
+
private cache;
|
|
137
|
+
get(key: string): ITokenModel;
|
|
138
|
+
set(key: string, value: ITokenModel): boolean;
|
|
139
|
+
remove(key: string): void;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* `sessionStorage` storage, **lost after closing the browser**.
|
|
144
|
+
*
|
|
145
|
+
* ```ts
|
|
146
|
+
provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),
|
|
147
|
+
provideAuth(withSessionStorage()),
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
declare class SessionStorageStore implements IStore {
|
|
151
|
+
get(key: string): ITokenModel;
|
|
152
|
+
set(key: string, value: ITokenModel | null): boolean;
|
|
153
|
+
remove(key: string): void;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* `cookie` storage
|
|
158
|
+
*
|
|
159
|
+
* ```ts
|
|
160
|
+
provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),
|
|
161
|
+
provideAuth(withCookie()),
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
declare class CookieStorageStore implements IStore {
|
|
165
|
+
private readonly srv;
|
|
166
|
+
get(key: string): ITokenModel;
|
|
167
|
+
set(key: string, value: ITokenModel | null | undefined): boolean;
|
|
168
|
+
remove(key: string): void;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
declare class AuthJWTGuardService {
|
|
172
|
+
private readonly srv;
|
|
173
|
+
process(url?: string): boolean;
|
|
174
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AuthJWTGuardService, never>;
|
|
175
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AuthJWTGuardService>;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
179
|
+
*
|
|
180
|
+
* ```ts
|
|
181
|
+
* data: {
|
|
182
|
+
* path: 'home',
|
|
183
|
+
* canActivate: [ authJWTCanActivate ],
|
|
184
|
+
* data: { guard: 'user1' }
|
|
185
|
+
* }
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
declare const authJWTCanActivate: CanActivateFn;
|
|
189
|
+
/**
|
|
190
|
+
* JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
191
|
+
*
|
|
192
|
+
* ```ts
|
|
193
|
+
* data: {
|
|
194
|
+
* path: 'home',
|
|
195
|
+
* canActivateChild: [ authJWTCanActivateChild ],
|
|
196
|
+
* data: { guard: 'user1' }
|
|
197
|
+
* }
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
declare const authJWTCanActivateChild: CanActivateChildFn;
|
|
201
|
+
/**
|
|
202
|
+
* JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
203
|
+
*
|
|
204
|
+
* ```ts
|
|
205
|
+
* data: {
|
|
206
|
+
* path: 'home',
|
|
207
|
+
* canMatch: [ authJWTCanMatch ],
|
|
208
|
+
* data: { guard: 'user1' }
|
|
209
|
+
* }
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
declare const authJWTCanMatch: CanMatchFn;
|
|
213
|
+
|
|
214
|
+
declare const authJWTInterceptor: HttpInterceptorFn;
|
|
215
|
+
|
|
216
|
+
interface JWT {
|
|
217
|
+
/**
|
|
218
|
+
* Issuerd
|
|
219
|
+
*/
|
|
220
|
+
iss: string;
|
|
221
|
+
/**
|
|
222
|
+
* Issued At
|
|
223
|
+
*/
|
|
224
|
+
iat: string;
|
|
225
|
+
/**
|
|
226
|
+
* Subject
|
|
227
|
+
*/
|
|
228
|
+
sub: string;
|
|
229
|
+
/**
|
|
230
|
+
* Expiration Time
|
|
231
|
+
*/
|
|
232
|
+
exp: number;
|
|
233
|
+
/**
|
|
234
|
+
* Audience
|
|
235
|
+
*/
|
|
236
|
+
aud: string;
|
|
237
|
+
/**
|
|
238
|
+
* Not Before
|
|
239
|
+
*/
|
|
240
|
+
nbf: string;
|
|
241
|
+
/**
|
|
242
|
+
* JWT ID
|
|
243
|
+
*/
|
|
244
|
+
jti: string;
|
|
245
|
+
[key: string]: any;
|
|
246
|
+
[key: number]: any;
|
|
247
|
+
}
|
|
248
|
+
declare class JWTTokenModel implements ITokenModel {
|
|
249
|
+
[key: string]: any;
|
|
250
|
+
token: string | null | undefined;
|
|
251
|
+
expired?: number;
|
|
252
|
+
/**
|
|
253
|
+
* 获取载荷信息
|
|
254
|
+
*/
|
|
255
|
+
get payload(): JWT;
|
|
256
|
+
/**
|
|
257
|
+
* 获取过期时间戳(单位:ms)
|
|
258
|
+
*/
|
|
259
|
+
get exp(): number | null;
|
|
260
|
+
/**
|
|
261
|
+
* 检查Token是否过期,当`payload` 包含 `exp` 字段时有效,若无 `exp` 字段直接返回 `null`
|
|
262
|
+
*
|
|
263
|
+
* @param offsetSeconds 偏移量
|
|
264
|
+
*/
|
|
265
|
+
isExpired(offsetSeconds?: number): boolean | null;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
declare function urlBase64Decode(str: string): string;
|
|
269
|
+
|
|
270
|
+
declare class AuthSimpleGuardService {
|
|
271
|
+
private readonly srv;
|
|
272
|
+
process(url?: string): boolean;
|
|
273
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AuthSimpleGuardService, never>;
|
|
274
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AuthSimpleGuardService>;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
278
|
+
*
|
|
279
|
+
* ```ts
|
|
280
|
+
* data: {
|
|
281
|
+
* path: 'home',
|
|
282
|
+
* canActivate: [ authSimpleCanActivate ],
|
|
283
|
+
* data: { guard: 'user1' }
|
|
284
|
+
* }
|
|
285
|
+
* ```
|
|
286
|
+
*/
|
|
287
|
+
declare const authSimpleCanActivate: CanActivateFn;
|
|
288
|
+
/**
|
|
289
|
+
* Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
290
|
+
*
|
|
291
|
+
* ```ts
|
|
292
|
+
* data: {
|
|
293
|
+
* path: 'home',
|
|
294
|
+
* canActivateChild: [ authSimpleCanActivateChild ],
|
|
295
|
+
* data: { guard: 'user1' }
|
|
296
|
+
* }
|
|
297
|
+
* ```
|
|
298
|
+
*/
|
|
299
|
+
declare const authSimpleCanActivateChild: CanActivateChildFn;
|
|
300
|
+
/**
|
|
301
|
+
* Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
302
|
+
*
|
|
303
|
+
* ```ts
|
|
304
|
+
* data: {
|
|
305
|
+
* path: 'home',
|
|
306
|
+
* canMatch: [ authSimpleCanMatch ],
|
|
307
|
+
* data: { guard: 'user1' }
|
|
308
|
+
* }
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
declare const authSimpleCanMatch: CanMatchFn;
|
|
312
|
+
|
|
313
|
+
declare const authSimpleInterceptor: HttpInterceptorFn;
|
|
314
|
+
|
|
315
|
+
declare class SimpleTokenModel implements ITokenModel {
|
|
316
|
+
[key: string]: any;
|
|
317
|
+
token: string | null | undefined;
|
|
318
|
+
expired?: number;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
declare function isAnonymous(req: HttpRequest<unknown>, options: AlainAuthConfig): boolean;
|
|
322
|
+
declare function throwErr(req: HttpRequest<unknown>, options: AlainAuthConfig): Observable<HttpEvent<unknown>>;
|
|
323
|
+
|
|
324
|
+
declare function DA_SERVICE_TOKEN_FACTORY(): ITokenService;
|
|
325
|
+
/**
|
|
326
|
+
* 维护Token信息服务,[在线文档](https://ng-alain.com/auth)
|
|
327
|
+
*/
|
|
328
|
+
declare class TokenService implements ITokenService, OnDestroy {
|
|
329
|
+
private readonly store;
|
|
330
|
+
private readonly cogSrv;
|
|
331
|
+
private refresh$;
|
|
332
|
+
private change$;
|
|
333
|
+
private interval$?;
|
|
334
|
+
private _referrer;
|
|
335
|
+
private _options;
|
|
336
|
+
constructor();
|
|
337
|
+
get refresh(): Observable<ITokenModel>;
|
|
338
|
+
get login_url(): string | undefined;
|
|
339
|
+
get referrer(): AuthReferrer;
|
|
340
|
+
get options(): AlainAuthConfig;
|
|
341
|
+
set(data: ITokenModel): boolean;
|
|
342
|
+
get(type?: any): any;
|
|
343
|
+
get<T extends ITokenModel>(type?: new () => T): T;
|
|
344
|
+
clear(options?: {
|
|
345
|
+
onlyToken: boolean;
|
|
346
|
+
}): void;
|
|
347
|
+
change(): Observable<ITokenModel | null>;
|
|
348
|
+
private builderRefresh;
|
|
349
|
+
private cleanRefresh;
|
|
350
|
+
ngOnDestroy(): void;
|
|
351
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TokenService, never>;
|
|
352
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TokenService>;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Whether to allow anonymous login
|
|
357
|
+
*
|
|
358
|
+
* 是否允许匿名登录
|
|
359
|
+
*
|
|
360
|
+
* @example
|
|
361
|
+
* this.http.post(`login`, {
|
|
362
|
+
* name: 'cipchk', pwd: '123456'
|
|
363
|
+
* }, {
|
|
364
|
+
* context: new HttpContext().set(ALLOW_ANONYMOUS, true)
|
|
365
|
+
* })
|
|
366
|
+
*/
|
|
367
|
+
declare const ALLOW_ANONYMOUS: HttpContextToken<boolean>;
|
|
368
|
+
|
|
369
|
+
declare const AUTH_DEFAULT_CONFIG: AlainAuthConfig;
|
|
370
|
+
declare function mergeConfig(srv: AlainConfigService): AlainAuthConfig;
|
|
371
|
+
|
|
372
|
+
declare enum AuthFeatureKind {
|
|
373
|
+
Store = 0
|
|
374
|
+
}
|
|
375
|
+
interface AuthFeature<KindT extends AuthFeatureKind> {
|
|
376
|
+
ɵkind: KindT;
|
|
377
|
+
ɵproviders: Provider[];
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Configures authentication process service to be available for injection.
|
|
381
|
+
*
|
|
382
|
+
* @see {@link withCookie}
|
|
383
|
+
* @see {@link withLocalStorage}
|
|
384
|
+
* @see {@link withSessionStorage}
|
|
385
|
+
*/
|
|
386
|
+
declare function provideAuth(store?: AuthFeature<AuthFeatureKind.Store>): EnvironmentProviders;
|
|
387
|
+
/** `cookie` storage */
|
|
388
|
+
declare function withCookie(): AuthFeature<AuthFeatureKind.Store>;
|
|
389
|
+
/** `localStorage` storage, **not lost after closing the browser**. */
|
|
390
|
+
declare function withLocalStorage(): AuthFeature<AuthFeatureKind.Store>;
|
|
391
|
+
/** `sessionStorage` storage, **lost after closing the browser**. */
|
|
392
|
+
declare function withSessionStorage(): AuthFeature<AuthFeatureKind.Store>;
|
|
393
|
+
/** Memory storage, **lost after closing the browser tab**. */
|
|
394
|
+
declare function withMemoryStorage(): AuthFeature<AuthFeatureKind.Store>;
|
|
395
|
+
|
|
396
|
+
export { ALLOW_ANONYMOUS, AUTH_DEFAULT_CONFIG, AuthFeatureKind, AuthJWTGuardService, AuthSimpleGuardService, CookieStorageStore, DA_SERVICE_TOKEN, DA_SERVICE_TOKEN_FACTORY, DA_STORE_TOKEN, DA_STORE_TOKEN_LOCAL_FACTORY, JWTTokenModel, LocalStorageStore, MemoryStore, SessionStorageStore, SimpleTokenModel, SocialService, TokenService, authJWTCanActivate, authJWTCanActivateChild, authJWTCanMatch, authJWTInterceptor, authSimpleCanActivate, authSimpleCanActivateChild, authSimpleCanMatch, authSimpleInterceptor, isAnonymous, mergeConfig, provideAuth, throwErr, urlBase64Decode, withCookie, withLocalStorage, withMemoryStorage, withSessionStorage };
|
|
397
|
+
export type { AuthFeature, AuthReferrer, IStore, ITokenModel, ITokenService, JWT, SocialOpenType };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@delon/auth",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "20.0.0-beta.0",
|
|
4
4
|
"author": "cipchk<cipchk@qq.com>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"ng-zorro-antd"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@delon/util": "^
|
|
28
|
+
"@delon/util": "^20.0.0-beta.0",
|
|
29
29
|
"tslib": "^2.3.0"
|
|
30
30
|
},
|
|
31
31
|
"module": "fesm2022/auth.mjs",
|
package/src/auth.config.d.ts
DELETED
package/src/index.d.ts
DELETED
package/src/provide.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { EnvironmentProviders, Provider } from '@angular/core';
|
|
2
|
-
export declare enum AuthFeatureKind {
|
|
3
|
-
Store = 0
|
|
4
|
-
}
|
|
5
|
-
export interface AuthFeature<KindT extends AuthFeatureKind> {
|
|
6
|
-
ɵkind: KindT;
|
|
7
|
-
ɵproviders: Provider[];
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Configures authentication process service to be available for injection.
|
|
11
|
-
*
|
|
12
|
-
* @see {@link withCookie}
|
|
13
|
-
* @see {@link withLocalStorage}
|
|
14
|
-
* @see {@link withSessionStorage}
|
|
15
|
-
*/
|
|
16
|
-
export declare function provideAuth(store?: AuthFeature<AuthFeatureKind.Store>): EnvironmentProviders;
|
|
17
|
-
/** `cookie` storage */
|
|
18
|
-
export declare function withCookie(): AuthFeature<AuthFeatureKind.Store>;
|
|
19
|
-
/** `localStorage` storage, **not lost after closing the browser**. */
|
|
20
|
-
export declare function withLocalStorage(): AuthFeature<AuthFeatureKind.Store>;
|
|
21
|
-
/** `sessionStorage` storage, **lost after closing the browser**. */
|
|
22
|
-
export declare function withSessionStorage(): AuthFeature<AuthFeatureKind.Store>;
|
|
23
|
-
/** Memory storage, **lost after closing the browser tab**. */
|
|
24
|
-
export declare function withMemoryStorage(): AuthFeature<AuthFeatureKind.Store>;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { ITokenModel } from '../token/interface';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export type SocialOpenType = 'href' | 'window';
|
|
6
|
-
export declare class SocialService implements OnDestroy {
|
|
7
|
-
private readonly tokenService;
|
|
8
|
-
private readonly doc;
|
|
9
|
-
private readonly router;
|
|
10
|
-
private _win;
|
|
11
|
-
private _winTime;
|
|
12
|
-
private observer;
|
|
13
|
-
/**
|
|
14
|
-
* 使用窗体打开授权页,返回值是 `Observable<ITokenModel>` 用于订阅授权后返回的结果
|
|
15
|
-
*
|
|
16
|
-
* @param url 获取授权地址
|
|
17
|
-
* @param callback 回调路由地址
|
|
18
|
-
* @param options.windowFeatures 等同 `window.open` 的 `features` 参数值
|
|
19
|
-
*/
|
|
20
|
-
login(url: string, callback?: string, options?: {
|
|
21
|
-
type?: 'window';
|
|
22
|
-
windowFeatures?: string;
|
|
23
|
-
}): Observable<ITokenModel>;
|
|
24
|
-
/**
|
|
25
|
-
* 跳转至授权页
|
|
26
|
-
*
|
|
27
|
-
* @param url 获取授权地址
|
|
28
|
-
* @param callback 回调路由地址
|
|
29
|
-
*/
|
|
30
|
-
login(url: string, callback?: string, options?: {
|
|
31
|
-
type?: 'href';
|
|
32
|
-
}): void;
|
|
33
|
-
/**
|
|
34
|
-
* 授权成功后的回调处理
|
|
35
|
-
*
|
|
36
|
-
* @param rawData 指定回调认证信息,为空时从根据当前URL解析
|
|
37
|
-
*/
|
|
38
|
-
callback(rawData?: ITokenModel | string | null): ITokenModel;
|
|
39
|
-
ngOnDestroy(): void;
|
|
40
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SocialService, never>;
|
|
41
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<SocialService>;
|
|
42
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { IStore } from './interface';
|
|
2
|
-
import { ITokenModel } from '../token/interface';
|
|
3
|
-
/**
|
|
4
|
-
* `cookie` storage
|
|
5
|
-
*
|
|
6
|
-
* ```ts
|
|
7
|
-
provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),
|
|
8
|
-
provideAuth(withCookie()),
|
|
9
|
-
* ```
|
|
10
|
-
*/
|
|
11
|
-
export declare class CookieStorageStore implements IStore {
|
|
12
|
-
private readonly srv;
|
|
13
|
-
get(key: string): ITokenModel;
|
|
14
|
-
set(key: string, value: ITokenModel | null | undefined): boolean;
|
|
15
|
-
remove(key: string): void;
|
|
16
|
-
}
|
package/src/store/index.d.ts
DELETED
package/src/store/interface.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
import { ITokenModel } from '../token/interface';
|
|
3
|
-
export declare const DA_STORE_TOKEN: InjectionToken<IStore>;
|
|
4
|
-
export interface IStore {
|
|
5
|
-
get(key: string): ITokenModel;
|
|
6
|
-
set(key: string, value: ITokenModel): boolean;
|
|
7
|
-
remove(key: string): void;
|
|
8
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { IStore } from './interface';
|
|
2
|
-
import { ITokenModel } from '../token/interface';
|
|
3
|
-
export declare function DA_STORE_TOKEN_LOCAL_FACTORY(): IStore;
|
|
4
|
-
/**
|
|
5
|
-
* `localStorage` storage, **not lost after closing the browser**.
|
|
6
|
-
*
|
|
7
|
-
* ```ts
|
|
8
|
-
provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),
|
|
9
|
-
provideAuth(withLocalStorage()),
|
|
10
|
-
* ```
|
|
11
|
-
*/
|
|
12
|
-
export declare class LocalStorageStore implements IStore {
|
|
13
|
-
get(key: string): ITokenModel;
|
|
14
|
-
set(key: string, value: ITokenModel | null): boolean;
|
|
15
|
-
remove(key: string): void;
|
|
16
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { IStore } from './interface';
|
|
2
|
-
import { ITokenModel } from '../token/interface';
|
|
3
|
-
/**
|
|
4
|
-
* 内存存储,关掉浏览器标签后**丢失**。
|
|
5
|
-
*/
|
|
6
|
-
export declare class MemoryStore implements IStore {
|
|
7
|
-
private cache;
|
|
8
|
-
get(key: string): ITokenModel;
|
|
9
|
-
set(key: string, value: ITokenModel): boolean;
|
|
10
|
-
remove(key: string): void;
|
|
11
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { IStore } from './interface';
|
|
2
|
-
import { ITokenModel } from '../token/interface';
|
|
3
|
-
/**
|
|
4
|
-
* `sessionStorage` storage, **lost after closing the browser**.
|
|
5
|
-
*
|
|
6
|
-
* ```ts
|
|
7
|
-
provideHttpClient(withInterceptors([...(environment.interceptorFns ?? []), authJWTInterceptor, defaultInterceptor])),
|
|
8
|
-
provideAuth(withSessionStorage()),
|
|
9
|
-
* ```
|
|
10
|
-
*/
|
|
11
|
-
export declare class SessionStorageStore implements IStore {
|
|
12
|
-
get(key: string): ITokenModel;
|
|
13
|
-
set(key: string, value: ITokenModel | null): boolean;
|
|
14
|
-
remove(key: string): void;
|
|
15
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { HttpEvent, HttpRequest } from '@angular/common/http';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { AlainAuthConfig } from '@delon/util/config';
|
|
4
|
-
export declare function isAnonymous(req: HttpRequest<unknown>, options: AlainAuthConfig): boolean;
|
|
5
|
-
export declare function throwErr(req: HttpRequest<unknown>, options: AlainAuthConfig): Observable<HttpEvent<unknown>>;
|
package/src/token/helper.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { AlainAuthConfig } from '@delon/util/config';
|
|
2
|
-
import { JWTTokenModel } from './jwt/jwt.model';
|
|
3
|
-
import { SimpleTokenModel } from './simple/simple.model';
|
|
4
|
-
export declare function CheckSimple(model: SimpleTokenModel | null): boolean;
|
|
5
|
-
export declare function CheckJwt(model: JWTTokenModel, offset: number): boolean;
|
|
6
|
-
export declare function ToLogin(options: AlainAuthConfig, url?: string): void;
|
package/src/token/index.d.ts
DELETED
package/src/token/interface.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { AlainAuthConfig } from '@delon/util/config';
|
|
4
|
-
export declare const DA_SERVICE_TOKEN: InjectionToken<ITokenService>;
|
|
5
|
-
export interface ITokenModel {
|
|
6
|
-
[key: string]: any;
|
|
7
|
-
token: string | null | undefined;
|
|
8
|
-
/**
|
|
9
|
-
* 过期时间,单位:ms
|
|
10
|
-
* - 不管Simple、JWT模式都必须指定
|
|
11
|
-
*/
|
|
12
|
-
expired?: number;
|
|
13
|
-
}
|
|
14
|
-
export interface AuthReferrer {
|
|
15
|
-
url?: string | null | undefined;
|
|
16
|
-
}
|
|
17
|
-
export interface ITokenService {
|
|
18
|
-
/**
|
|
19
|
-
* 授权失败后跳转路由路径(支持外部链接地址),通过设置[全局配置](https://ng-alain.com/docs/global-config)来改变
|
|
20
|
-
*/
|
|
21
|
-
readonly login_url: string | undefined;
|
|
22
|
-
/**
|
|
23
|
-
* 当前请求页面的来源页面的地址
|
|
24
|
-
*/
|
|
25
|
-
readonly referrer?: AuthReferrer;
|
|
26
|
-
readonly options: AlainAuthConfig;
|
|
27
|
-
/**
|
|
28
|
-
* 订阅刷新,订阅时会自动产生一个定时器,每隔一段时间进行一些校验
|
|
29
|
-
* - **注意** 会多次触发,请务必做好业务判断
|
|
30
|
-
*/
|
|
31
|
-
readonly refresh: Observable<ITokenModel>;
|
|
32
|
-
/**
|
|
33
|
-
* 设置 Token 信息,当用户 Token 发生变动时都需要调用此方法重新刷新
|
|
34
|
-
* - 如果需要监听过期,需要传递 `expired` 值
|
|
35
|
-
*/
|
|
36
|
-
set(data: ITokenModel | null): boolean;
|
|
37
|
-
/**
|
|
38
|
-
* 获取Token,形式包括:
|
|
39
|
-
* - `get()` 获取 Simple Token
|
|
40
|
-
* - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token
|
|
41
|
-
*/
|
|
42
|
-
get(type?: any): ITokenModel | null;
|
|
43
|
-
/**
|
|
44
|
-
* 获取Token,形式包括:
|
|
45
|
-
* - `get()` 获取 Simple Token
|
|
46
|
-
* - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token
|
|
47
|
-
*/
|
|
48
|
-
get<T extends ITokenModel>(type?: any): T;
|
|
49
|
-
/**
|
|
50
|
-
* 清除 Token 信息,当用户退出登录时调用。
|
|
51
|
-
* ```
|
|
52
|
-
* // 清除所有 Token 信息
|
|
53
|
-
* tokenService.clear();
|
|
54
|
-
* // 只清除 token 字段
|
|
55
|
-
* tokenService.clear({ onlyToken: true });
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
|
-
clear(options?: {
|
|
59
|
-
onlyToken: boolean;
|
|
60
|
-
}): void;
|
|
61
|
-
/**
|
|
62
|
-
* 订阅 Token 对象变更通知
|
|
63
|
-
*/
|
|
64
|
-
change(): Observable<ITokenModel | null>;
|
|
65
|
-
}
|
package/src/token/jwt/index.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { CanActivateChildFn, CanActivateFn, CanMatchFn } from '@angular/router';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export declare class AuthJWTGuardService {
|
|
4
|
-
private readonly srv;
|
|
5
|
-
process(url?: string): boolean;
|
|
6
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AuthJWTGuardService, never>;
|
|
7
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<AuthJWTGuardService>;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
11
|
-
*
|
|
12
|
-
* ```ts
|
|
13
|
-
* data: {
|
|
14
|
-
* path: 'home',
|
|
15
|
-
* canActivate: [ authJWTCanActivate ],
|
|
16
|
-
* data: { guard: 'user1' }
|
|
17
|
-
* }
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
export declare const authJWTCanActivate: CanActivateFn;
|
|
21
|
-
/**
|
|
22
|
-
* JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
23
|
-
*
|
|
24
|
-
* ```ts
|
|
25
|
-
* data: {
|
|
26
|
-
* path: 'home',
|
|
27
|
-
* canActivateChild: [ authJWTCanActivateChild ],
|
|
28
|
-
* data: { guard: 'user1' }
|
|
29
|
-
* }
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export declare const authJWTCanActivateChild: CanActivateChildFn;
|
|
33
|
-
/**
|
|
34
|
-
* JWT 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
35
|
-
*
|
|
36
|
-
* ```ts
|
|
37
|
-
* data: {
|
|
38
|
-
* path: 'home',
|
|
39
|
-
* canMatch: [ authJWTCanMatch ],
|
|
40
|
-
* data: { guard: 'user1' }
|
|
41
|
-
* }
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export declare const authJWTCanMatch: CanMatchFn;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function urlBase64Decode(str: string): string;
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { ITokenModel } from '../interface';
|
|
2
|
-
export interface JWT {
|
|
3
|
-
/**
|
|
4
|
-
* Issuerd
|
|
5
|
-
*/
|
|
6
|
-
iss: string;
|
|
7
|
-
/**
|
|
8
|
-
* Issued At
|
|
9
|
-
*/
|
|
10
|
-
iat: string;
|
|
11
|
-
/**
|
|
12
|
-
* Subject
|
|
13
|
-
*/
|
|
14
|
-
sub: string;
|
|
15
|
-
/**
|
|
16
|
-
* Expiration Time
|
|
17
|
-
*/
|
|
18
|
-
exp: number;
|
|
19
|
-
/**
|
|
20
|
-
* Audience
|
|
21
|
-
*/
|
|
22
|
-
aud: string;
|
|
23
|
-
/**
|
|
24
|
-
* Not Before
|
|
25
|
-
*/
|
|
26
|
-
nbf: string;
|
|
27
|
-
/**
|
|
28
|
-
* JWT ID
|
|
29
|
-
*/
|
|
30
|
-
jti: string;
|
|
31
|
-
[key: string]: any;
|
|
32
|
-
[key: number]: any;
|
|
33
|
-
}
|
|
34
|
-
export declare class JWTTokenModel implements ITokenModel {
|
|
35
|
-
[key: string]: any;
|
|
36
|
-
token: string | null | undefined;
|
|
37
|
-
expired?: number;
|
|
38
|
-
/**
|
|
39
|
-
* 获取载荷信息
|
|
40
|
-
*/
|
|
41
|
-
get payload(): JWT;
|
|
42
|
-
/**
|
|
43
|
-
* 获取过期时间戳(单位:ms)
|
|
44
|
-
*/
|
|
45
|
-
get exp(): number | null;
|
|
46
|
-
/**
|
|
47
|
-
* 检查Token是否过期,当`payload` 包含 `exp` 字段时有效,若无 `exp` 字段直接返回 `null`
|
|
48
|
-
*
|
|
49
|
-
* @param offsetSeconds 偏移量
|
|
50
|
-
*/
|
|
51
|
-
isExpired(offsetSeconds?: number): boolean | null;
|
|
52
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { CanActivateChildFn, CanActivateFn, CanMatchFn } from '@angular/router';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export declare class AuthSimpleGuardService {
|
|
4
|
-
private readonly srv;
|
|
5
|
-
process(url?: string): boolean;
|
|
6
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<AuthSimpleGuardService, never>;
|
|
7
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<AuthSimpleGuardService>;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
11
|
-
*
|
|
12
|
-
* ```ts
|
|
13
|
-
* data: {
|
|
14
|
-
* path: 'home',
|
|
15
|
-
* canActivate: [ authSimpleCanActivate ],
|
|
16
|
-
* data: { guard: 'user1' }
|
|
17
|
-
* }
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
export declare const authSimpleCanActivate: CanActivateFn;
|
|
21
|
-
/**
|
|
22
|
-
* Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
23
|
-
*
|
|
24
|
-
* ```ts
|
|
25
|
-
* data: {
|
|
26
|
-
* path: 'home',
|
|
27
|
-
* canActivateChild: [ authSimpleCanActivateChild ],
|
|
28
|
-
* data: { guard: 'user1' }
|
|
29
|
-
* }
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export declare const authSimpleCanActivateChild: CanActivateChildFn;
|
|
33
|
-
/**
|
|
34
|
-
* Simple 路由守卫, [ACL Document](https://ng-alain.com/auth/guard).
|
|
35
|
-
*
|
|
36
|
-
* ```ts
|
|
37
|
-
* data: {
|
|
38
|
-
* path: 'home',
|
|
39
|
-
* canMatch: [ authSimpleCanMatch ],
|
|
40
|
-
* data: { guard: 'user1' }
|
|
41
|
-
* }
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export declare const authSimpleCanMatch: CanMatchFn;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { AlainAuthConfig, AlainConfigService } from '@delon/util/config';
|
|
4
|
-
import { AuthReferrer, ITokenModel, ITokenService } from './interface';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export declare function DA_SERVICE_TOKEN_FACTORY(): ITokenService;
|
|
7
|
-
/**
|
|
8
|
-
* 维护Token信息服务,[在线文档](https://ng-alain.com/auth)
|
|
9
|
-
*/
|
|
10
|
-
export declare class TokenService implements ITokenService, OnDestroy {
|
|
11
|
-
private readonly store;
|
|
12
|
-
private refresh$;
|
|
13
|
-
private change$;
|
|
14
|
-
private interval$?;
|
|
15
|
-
private _referrer;
|
|
16
|
-
private _options;
|
|
17
|
-
constructor(configSrv: AlainConfigService);
|
|
18
|
-
get refresh(): Observable<ITokenModel>;
|
|
19
|
-
get login_url(): string | undefined;
|
|
20
|
-
get referrer(): AuthReferrer;
|
|
21
|
-
get options(): AlainAuthConfig;
|
|
22
|
-
set(data: ITokenModel): boolean;
|
|
23
|
-
get(type?: any): any;
|
|
24
|
-
get<T extends ITokenModel>(type?: new () => T): T;
|
|
25
|
-
clear(options?: {
|
|
26
|
-
onlyToken: boolean;
|
|
27
|
-
}): void;
|
|
28
|
-
change(): Observable<ITokenModel | null>;
|
|
29
|
-
private builderRefresh;
|
|
30
|
-
private cleanRefresh;
|
|
31
|
-
ngOnDestroy(): void;
|
|
32
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TokenService, never>;
|
|
33
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<TokenService>;
|
|
34
|
-
}
|
package/src/token.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { HttpContextToken } from '@angular/common/http';
|
|
2
|
-
/**
|
|
3
|
-
* Whether to allow anonymous login
|
|
4
|
-
*
|
|
5
|
-
* 是否允许匿名登录
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* this.http.post(`login`, {
|
|
9
|
-
* name: 'cipchk', pwd: '123456'
|
|
10
|
-
* }, {
|
|
11
|
-
* context: new HttpContext().set(ALLOW_ANONYMOUS, true)
|
|
12
|
-
* })
|
|
13
|
-
*/
|
|
14
|
-
export declare const ALLOW_ANONYMOUS: HttpContextToken<boolean>;
|