@benlampson/heimdall-browser 0.0.0-stage → 5.5.3

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/README.md CHANGED
@@ -1,3 +1,31 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # @benlampson/heimdall-browser
2
+
3
+ 框架无关的 Heimdall 浏览器 Token 与数据客户端,版本跟随 Heimdall 整体 Release。
4
+
5
+ 提供 Code + PKCE、Device Code、JWT 校验/未验证解码、JWT/opaque Access Token 获取与刷新、可选自动刷新、UserInfo、受控 Bearer 请求及撤销/退出。没有 UI、业务后端状态接口或数据库依赖。
6
+
7
+ 默认自动保存到 localStorage;可选 sessionStorage、自定义 Storage 或 `storage: false` 仅使用内存。localStorage 跨标签页协调要求 Web Locks。浏览器不使用 Client Secret。
8
+
9
+ 公开接口与示例见仓库 [SDK 指南](https://github.com/BenLampson/Asgard.Heimdall/blob/main/sdk/README.md)。
10
+
11
+ `HeimdallProtocolClient` 从 `@benlampson/heimdall-browser/protocol` 导出,无 window 或存储访问;完整 Token 和登录事务由调用方保存。
12
+
13
+ ```ts
14
+ import { HeimdallBrowserClient } from '@benlampson/heimdall-browser';
15
+ const client = new HeimdallBrowserClient({
16
+ authority: 'https://idp.example.com/tenant-a', clientId: 'business-spa',
17
+ tenantId: 'tenant-a', applicationId: 'business-app', audience: 'business-api',
18
+ scope: 'openid profile offline_access business.api',
19
+ redirectUri: 'https://business.example.com/callback',
20
+ resourceBaseUrls: ['https://api.example.com/'], automaticRenew: true,
21
+ });
22
+ // 生成登录地址,由应用决定如何使用。
23
+ const { url } = await client.createLoginRequest();
24
+ // 在应用自己的回调路由中:await client.handleLoginCallback();
25
+ // 业务按需获取:await client.getAccessToken() / client.getTokenSet();
26
+ // 主动刷新:await client.refreshAccessToken();
27
+ // 开关自动刷新:client.setAutomaticRenew(false);
28
+ // 设备登录:requestDeviceAuthorization / exchangeDeviceCode / waitForDeviceToken。
29
+ ```
30
+
31
+ 登录方式在 Heimdall 托管页面完成,SDK 统一使用授权码 + PKCE。business.api 是需登记的示例 scope;回调、Origin、grant 与 audience 按实际 Client 配置。
@@ -0,0 +1,11 @@
1
+ import { type HeimdallIdentity } from './types.js';
2
+ /** Asgard claim 当前使用数组或 JSON 数组字符串;不进行宽松字符串权限猜测。 */
3
+ export declare function claimArray(value: unknown): string[];
4
+ /** 仅提取身份数据快照;此处解码不能承担登录或 API 验证。 */
5
+ export declare function displayIdentity(token: string): HeimdallIdentity;
6
+ /** 只判断声明集合,不代替后端业务授权。 */
7
+ export declare function hasAllPermissions(identity: HeimdallIdentity | null, permissions: readonly string[]): boolean;
8
+ /** 回跳只允许本站路径,拒绝绝对 URL、反斜杠及控制字符。 */
9
+ export declare function safeReturnPath(path?: string): string;
10
+ /** 精确比较会话身份,刷新不能漂移到最近的 IDP 账号。 */
11
+ export declare function sameIdentity(left: Pick<HeimdallIdentity, 'issuer' | 'clientId' | 'tenantId' | 'applicationId' | 'subjectId' | 'sessionId'>, right: Pick<HeimdallIdentity, 'issuer' | 'clientId' | 'tenantId' | 'applicationId' | 'subjectId' | 'sessionId'>): boolean;
package/dist/claims.js ADDED
@@ -0,0 +1,47 @@
1
+ import { decodeJwt } from 'jose';
2
+ import { HeimdallBrowserError } from './types.js';
3
+ /** Asgard claim 当前使用数组或 JSON 数组字符串;不进行宽松字符串权限猜测。 */
4
+ export function claimArray(value) {
5
+ if (typeof value === 'string') {
6
+ try {
7
+ value = JSON.parse(value);
8
+ }
9
+ catch {
10
+ return [];
11
+ }
12
+ }
13
+ return Array.isArray(value) && value.every(item => typeof item === 'string' && item.length > 0) ? [...new Set(value)] : [];
14
+ }
15
+ /** 仅提取身份数据快照;此处解码不能承担登录或 API 验证。 */
16
+ export function displayIdentity(token) {
17
+ const payload = decodeJwt(token);
18
+ const text = (key) => typeof payload[key] === 'string' ? payload[key] : '';
19
+ if (!text('sub') || !text('sid'))
20
+ throw new HeimdallBrowserError('invalid_identity');
21
+ return { issuer: text('iss'), clientId: text('client_id'), tenantId: text('tenant_id'), applicationId: text('application_id'),
22
+ subjectId: text('sub'), sessionId: text('sid'), roles: claimArray(payload.roles), permissions: claimArray(payload.permissions) };
23
+ }
24
+ /** 只判断声明集合,不代替后端业务授权。 */
25
+ export function hasAllPermissions(identity, permissions) {
26
+ return identity !== null && permissions.every(value => identity.permissions.includes(value));
27
+ }
28
+ /** 回跳只允许本站路径,拒绝绝对 URL、反斜杠及控制字符。 */
29
+ export function safeReturnPath(path = '/') {
30
+ if (!path.startsWith('/') || path.startsWith('//') || /[\\\x00-\x1f\x7f]/.test(path))
31
+ throw new HeimdallBrowserError('invalid_return_path');
32
+ let decoded;
33
+ try {
34
+ decoded = decodeURIComponent(path);
35
+ }
36
+ catch {
37
+ throw new HeimdallBrowserError('invalid_return_path');
38
+ }
39
+ if (decoded.startsWith('//') || /[\\\x00-\x1f\x7f]/.test(decoded))
40
+ throw new HeimdallBrowserError('invalid_return_path');
41
+ return path;
42
+ }
43
+ /** 精确比较会话身份,刷新不能漂移到最近的 IDP 账号。 */
44
+ export function sameIdentity(left, right) {
45
+ return ['issuer', 'clientId', 'tenantId', 'applicationId', 'subjectId', 'sessionId'].every(key => left[key] === right[key]);
46
+ }
47
+ //# sourceMappingURL=claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.js","sourceRoot":"","sources":["../src/claims.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { HeimdallProtocolClient } from './protocol.js';
2
+ import type { HeimdallTokenSet, HeimdallLoginOptions, HeimdallDeviceAuthorization, HeimdallDeviceTokenResult } from './protocol-types.js';
3
+ import { type ApplicationLogoutResult, type HeimdallBrowserOptions, type HeimdallSnapshot } from './types.js';
4
+ /** 框架无关的 Token 客户端,协议校验与凭据保存分离。 */
5
+ export declare class HeimdallBrowserClient {
6
+ private readonly options;
7
+ private readonly sessions;
8
+ private readonly listeners;
9
+ private snapshot;
10
+ /** 无存储协议入口,直接返回 Token 结果。 */
11
+ readonly protocol: HeimdallProtocolClient;
12
+ private renewal?;
13
+ private timer?;
14
+ private automaticRenew;
15
+ private readonly storageHandler;
16
+ private readonly visibilityHandler;
17
+ constructor(options: HeimdallBrowserOptions);
18
+ /** 返回稳定的身份数据快照,不公开令牌。 */
19
+ getSnapshot: () => HeimdallSnapshot;
20
+ subscribe: (listener: () => void) => (() => void);
21
+ /** 每次协议操作使用隔离用户存储,事务存储仍由 oidc-client-ts 消费一次性 state。 */
22
+ private manager;
23
+ /** 生成浏览器回调可消费的地址,接入方决定是否跳转;事务临时保存在 sessionStorage。 */
24
+ createLoginRequest(returnPath?: string, login?: Omit<HeimdallLoginOptions, 'responseMode'>): Promise<{
25
+ url: string;
26
+ }>;
27
+ /** 明确发起登录;默认允许服务器使用现有 SSO,账号选择必须显式要求。 */
28
+ login(returnPath?: string, login?: Omit<HeimdallLoginOptions, 'responseMode'>): Promise<void>;
29
+ /** 候选失败或取消保留原应用身份。 */
30
+ switchAccount(returnPath?: string): Promise<void>;
31
+ /** 回调先完整验证再原子提交,提交后才撤销旧应用的凭据。 */
32
+ handleLoginCallback(url?: string): Promise<{
33
+ returnPath: string;
34
+ previousRevocationConfirmed: boolean;
35
+ tokens: HeimdallTokenSet;
36
+ }>;
37
+ /** 续期只使用 RT;不通过 iframe 自动从 IDP Cookie 恢复退出的登录。 */
38
+ getAccessToken(): Promise<string>;
39
+ /** 主动使用 Refresh Token 换取新 JWT,验证后自动保存。 */
40
+ refreshAccessToken(): Promise<string>;
41
+ /** 运行时开启或关闭后台自动续期。 */
42
+ setAutomaticRenew(enabled: boolean): void;
43
+ private obtainAccessToken;
44
+ /** Bearer 仅发送到配置资源前缀;禁止重定向,旧响应不能覆盖新身份数据。 */
45
+ fetch(input: string | URL, init?: RequestInit): Promise<Response>;
46
+ /** 展示资料来自 Discovery UserInfo,响应主体必须匹配当前会话。 */
47
+ getUserInfo(): Promise<Record<string, unknown>>;
48
+ /** 普通退出先结束本地版本,网络失败不恢复凭据。 */
49
+ logoutApplication(): Promise<ApplicationLogoutResult>;
50
+ /** 统一退出是独立明确操作,捕获原 ID Token;回调不声称通知全部送达。 */
51
+ logoutSso(): Promise<void>;
52
+ /** OIDC 库消费退出 state,迟到回跳不得清理后来建立的会话。 */
53
+ handleLogoutCallback(url?: string): Promise<{
54
+ returnedFromSso: true;
55
+ }>;
56
+ /** 卸载时释放监听和自动续期计时器;不注销用户。 */
57
+ dispose(): void;
58
+ private validate;
59
+ /** opaque 身份来自已签名 ID Token,角色权限不可从 opaque 解码。 */
60
+ private identity;
61
+ /** 完整凭据返回给调用方;Token 的取得时间与剩余有效期对应。 */
62
+ private tokens;
63
+ /** 获取完整 Token 结果,业务可完全自行保存。 */
64
+ getTokenSet(): Promise<HeimdallTokenSet>;
65
+ /** 设备码发起时绑定当前版本,退出或其它登录后不得覆盖它。 */
66
+ requestDeviceAuthorization(signal?: AbortSignal): Promise<HeimdallDeviceAuthorization & {
67
+ browserVersion: string;
68
+ }>;
69
+ /** 只尝试一次,成功后核对版本、校验身份并更新所选存储。 */
70
+ exchangeDeviceCode(device: HeimdallDeviceAuthorization & {
71
+ browserVersion: string;
72
+ }, signal?: AbortSignal): Promise<HeimdallDeviceTokenResult>;
73
+ /** 可取消轮询,收到 Token 后才提交浏览器凭据。 */
74
+ waitForDeviceToken(device: HeimdallDeviceAuthorization & {
75
+ browserVersion: string;
76
+ }, signal?: AbortSignal): Promise<HeimdallTokenSet>;
77
+ private acceptDeviceTokens;
78
+ private endCaptured;
79
+ /** 读取完整响应体后再次核对版本,防止 headers 已到而 body 迟到时污染新账号界面。 */
80
+ private guardResponse;
81
+ private revoke;
82
+ private readSnapshot;
83
+ private changed;
84
+ private scheduleRenew;
85
+ private trustedUrl;
86
+ private ensureResource;
87
+ private validateOptions;
88
+ }
package/dist/client.js ADDED
@@ -0,0 +1,378 @@
1
+ import { OidcClient, User, UserManager, WebStorageStateStore } from 'oidc-client-ts';
2
+ import { HeimdallProtocolClient } from './protocol.js';
3
+ import { displayIdentity, safeReturnPath, sameIdentity } from './claims.js';
4
+ import { MemoryStorage, SessionStore } from './session.js';
5
+ import { HeimdallBrowserError } from './types.js';
6
+ /** 框架无关的 Token 客户端,协议校验与凭据保存分离。 */
7
+ export class HeimdallBrowserClient {
8
+ options;
9
+ sessions;
10
+ listeners = new Set();
11
+ snapshot;
12
+ /** 无存储协议入口,直接返回 Token 结果。 */
13
+ protocol;
14
+ renewal;
15
+ timer;
16
+ automaticRenew;
17
+ storageHandler = (event) => { if (event.key === this.sessions.key)
18
+ this.changed(); };
19
+ visibilityHandler = () => { if (document.visibilityState === 'visible' && this.sessions.read().user)
20
+ void this.getAccessToken().catch(() => undefined); };
21
+ constructor(options) {
22
+ this.options = options;
23
+ this.validateOptions();
24
+ this.protocol = new HeimdallProtocolClient(options);
25
+ this.automaticRenew = options.automaticRenew ?? false;
26
+ const namespace = 'heimdall.sdk:' + JSON.stringify([options.authority, options.clientId, options.applicationId]);
27
+ this.sessions = new SessionStore(namespace, options.storage === false ? new MemoryStorage() : options.storage ?? window.localStorage, options.storage !== false && ((options.storage ?? window.localStorage) === window.localStorage || (options.sharedStorage ?? false)));
28
+ this.snapshot = this.readSnapshot();
29
+ window.addEventListener('storage', this.storageHandler);
30
+ document.addEventListener('visibilitychange', this.visibilityHandler);
31
+ this.scheduleRenew();
32
+ }
33
+ /** 返回稳定的身份数据快照,不公开令牌。 */
34
+ getSnapshot = () => this.snapshot;
35
+ subscribe = (listener) => { this.listeners.add(listener); return () => this.listeners.delete(listener); };
36
+ /** 每次协议操作使用隔离用户存储,事务存储仍由 oidc-client-ts 消费一次性 state。 */
37
+ async manager() {
38
+ return new UserManager({ authority: this.options.authority, client_id: this.options.clientId,
39
+ metadata: await this.protocol.getDiscovery(), fetchRequestCredentials: 'omit',
40
+ redirect_uri: this.options.redirectUri, post_logout_redirect_uri: this.options.postLogoutRedirectUri,
41
+ response_type: 'code', scope: this.options.scope ?? 'openid profile email offline_access',
42
+ automaticSilentRenew: false, loadUserInfo: false, filterProtocolClaims: false,
43
+ stateStore: new WebStorageStateStore({ store: window.sessionStorage, prefix: this.sessions.key + ':oidc:' }),
44
+ userStore: new WebStorageStateStore({ store: new MemoryStorage() }), requestTimeoutInSeconds: 15 });
45
+ }
46
+ /** 生成浏览器回调可消费的地址,接入方决定是否跳转;事务临时保存在 sessionStorage。 */
47
+ async createLoginRequest(returnPath = '/', login = {}) {
48
+ if (login.maxAge !== undefined && (!Number.isSafeInteger(login.maxAge) || login.maxAge < 0))
49
+ throw new HeimdallBrowserError('invalid_max_age');
50
+ if (login.prompt !== undefined && !['none', 'login', 'consent', 'select_account'].includes(login.prompt))
51
+ throw new HeimdallBrowserError('invalid_login_parameters');
52
+ const request = await new OidcClient((await this.manager()).settings).createSigninRequest({ prompt: login.prompt, max_age: login.maxAge, nonce: crypto.randomUUID(),
53
+ state: { sdk: 1, version: this.sessions.read().version, returnPath: safeReturnPath(returnPath) } });
54
+ return { url: request.url };
55
+ }
56
+ /** 明确发起登录;默认允许服务器使用现有 SSO,账号选择必须显式要求。 */
57
+ async login(returnPath = '/', login = {}) {
58
+ const request = await this.createLoginRequest(returnPath, login);
59
+ window.location.assign(request.url);
60
+ }
61
+ /** 候选失败或取消保留原应用身份。 */
62
+ async switchAccount(returnPath = '/') { await this.login(returnPath, { prompt: 'select_account' }); }
63
+ /** 回调先完整验证再原子提交,提交后才撤销旧应用的凭据。 */
64
+ async handleLoginCallback(url) {
65
+ return this.sessions.protocol(async () => {
66
+ const manager = await this.manager();
67
+ const callback = url ?? window.location.href;
68
+ let saved;
69
+ try {
70
+ ({ state: saved } = await new OidcClient(manager.settings).readSigninResponseState(callback, true));
71
+ }
72
+ catch {
73
+ throw new HeimdallBrowserError('invalid_login_callback');
74
+ }
75
+ finally {
76
+ await manager.events.unload();
77
+ }
78
+ const state = saved.data;
79
+ if (state?.sdk !== 1 || typeof state.version !== 'string')
80
+ throw new HeimdallBrowserError('invalid_callback_state');
81
+ const target = safeReturnPath(state.returnPath);
82
+ // Token POST 统一由纯协议层发送,禁止 HTTP 重定向重发 code/verifier/RT。
83
+ const tokens = await this.protocol.exchangeCode(new URL(callback).searchParams, { url: '', state: saved.id, nonce: saved.nonce ?? '',
84
+ codeVerifier: saved.code_verifier ?? '', authority: saved.authority, clientId: saved.client_id, redirectUri: saved.redirect_uri, createdAt: saved.created * 1000 });
85
+ const profile = await this.protocol.validateJwt(tokens.id_token, { idToken: true });
86
+ const candidate = new User({ ...tokens, expires_at: Math.floor(tokens.obtained_at / 1000) + tokens.expires_in, profile: profile, userState: state });
87
+ await this.validate(candidate, true);
88
+ let previous = null;
89
+ await this.sessions.locked(() => {
90
+ const old = this.sessions.read();
91
+ if (old.user)
92
+ previous = User.fromStorageString(old.user);
93
+ this.sessions.commit(state.version, candidate.toStorageString());
94
+ });
95
+ this.changed();
96
+ const oldUser = previous;
97
+ const confirmed = oldUser && oldUser.access_token !== candidate.access_token ? await this.revoke(oldUser) : true;
98
+ return { returnPath: target, previousRevocationConfirmed: confirmed, tokens: this.tokens(candidate) };
99
+ });
100
+ }
101
+ /** 续期只使用 RT;不通过 iframe 自动从 IDP Cookie 恢复退出的登录。 */
102
+ async getAccessToken() { return this.obtainAccessToken(false); }
103
+ /** 主动使用 Refresh Token 换取新 JWT,验证后自动保存。 */
104
+ async refreshAccessToken() { return this.obtainAccessToken(true); }
105
+ /** 运行时开启或关闭后台自动续期。 */
106
+ setAutomaticRenew(enabled) { this.automaticRenew = enabled; this.scheduleRenew(); }
107
+ async obtainAccessToken(forceRefresh) {
108
+ if (this.renewal)
109
+ return this.renewal;
110
+ this.renewal = this.sessions.protocol(async () => {
111
+ const captured = this.sessions.read();
112
+ if (!captured.user)
113
+ throw new HeimdallBrowserError('not_authenticated');
114
+ const oldUser = User.fromStorageString(captured.user);
115
+ let candidate = oldUser;
116
+ if (forceRefresh || oldUser.expired || (oldUser.refresh_token && (oldUser.expires_in ?? 0) < 60)) {
117
+ if (!oldUser.refresh_token)
118
+ throw new HeimdallBrowserError('login_required');
119
+ try {
120
+ const identity = this.identity(oldUser);
121
+ const tokens = await this.protocol.refreshToken(oldUser.refresh_token, { subjectId: identity.subjectId, sessionId: identity.sessionId });
122
+ const profile = tokens.id_token ? await this.protocol.validateJwt(tokens.id_token, { idToken: true }) : oldUser.profile;
123
+ candidate = new User({ ...tokens, refresh_token: tokens.refresh_token ?? oldUser.refresh_token,
124
+ id_token: tokens.id_token ?? oldUser.id_token, scope: tokens.scope ?? oldUser.scope,
125
+ expires_at: Math.floor(tokens.obtained_at / 1000) + tokens.expires_in, profile: profile });
126
+ }
127
+ catch (error) {
128
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'invalid_grant')
129
+ await this.endCaptured(captured, oldUser.access_token);
130
+ throw new HeimdallBrowserError('renewal_failed');
131
+ }
132
+ }
133
+ if (!sameIdentity(this.identity(oldUser), this.identity(candidate)))
134
+ throw new HeimdallBrowserError('identity_changed');
135
+ await this.validate(candidate, candidate.id_token !== oldUser.id_token);
136
+ await this.sessions.locked(() => {
137
+ const current = this.sessions.read();
138
+ if (current.version !== captured.version || current.user !== captured.user)
139
+ throw new HeimdallBrowserError('session_changed');
140
+ if (candidate !== oldUser)
141
+ this.sessions.commit(captured.version, candidate.toStorageString());
142
+ });
143
+ this.changed();
144
+ return candidate.access_token;
145
+ }).finally(() => { this.renewal = undefined; });
146
+ return this.renewal;
147
+ }
148
+ /** Bearer 仅发送到配置资源前缀;禁止重定向,旧响应不能覆盖新身份数据。 */
149
+ async fetch(input, init = {}) {
150
+ const url = new URL(input, window.location.origin);
151
+ this.ensureResource(url);
152
+ const token = await this.getAccessToken();
153
+ const captured = this.sessions.read();
154
+ if (!captured.user || User.fromStorageString(captured.user).access_token !== token)
155
+ throw new HeimdallBrowserError('session_changed');
156
+ const headers = new Headers(init.headers);
157
+ headers.set('Authorization', `Bearer ${token}`);
158
+ const response = await globalThis.fetch(url, { ...init, headers, credentials: 'omit', redirect: 'error',
159
+ signal: init.signal ?? AbortSignal.timeout(15000) });
160
+ const current = this.sessions.read();
161
+ if (current.version !== captured.version || !current.user || User.fromStorageString(current.user).access_token !== token)
162
+ throw new HeimdallBrowserError('session_changed');
163
+ if (response.status === 401)
164
+ await this.endCaptured(captured, token);
165
+ return this.guardResponse(response, captured.version, token);
166
+ }
167
+ /** 展示资料来自 Discovery UserInfo,响应主体必须匹配当前会话。 */
168
+ async getUserInfo() {
169
+ const token = await this.getAccessToken();
170
+ const captured = this.sessions.read();
171
+ if (!captured.user || User.fromStorageString(captured.user).access_token !== token)
172
+ throw new HeimdallBrowserError('session_changed');
173
+ const profile = await this.protocol.getUserInfo(token, this.identity(User.fromStorageString(captured.user)).subjectId);
174
+ if (this.sessions.read().version !== captured.version)
175
+ throw new HeimdallBrowserError('session_changed');
176
+ if (profile.sub !== this.identity(User.fromStorageString(captured.user)).subjectId)
177
+ throw new HeimdallBrowserError('identity_changed');
178
+ return profile;
179
+ }
180
+ /** 普通退出先结束本地版本,网络失败不恢复凭据。 */
181
+ async logoutApplication() {
182
+ let user = null;
183
+ await this.sessions.locked(() => {
184
+ const captured = this.sessions.read();
185
+ user = captured.user ? User.fromStorageString(captured.user) : null;
186
+ this.sessions.commit(captured.version);
187
+ });
188
+ this.changed();
189
+ return { localLogoutCompleted: true, revocationConfirmed: user ? await this.revoke(user) : true };
190
+ }
191
+ /** 统一退出是独立明确操作,捕获原 ID Token;回调不声称通知全部送达。 */
192
+ async logoutSso() {
193
+ let captured;
194
+ let user;
195
+ let endedVersion;
196
+ await this.sessions.locked(() => {
197
+ captured = this.sessions.read();
198
+ if (!captured.user)
199
+ throw new HeimdallBrowserError('not_authenticated');
200
+ user = User.fromStorageString(captured.user);
201
+ if (!user.id_token || !this.identity(user).sessionId)
202
+ throw new HeimdallBrowserError('logout_hint_missing');
203
+ endedVersion = this.sessions.commit(captured.version).version;
204
+ });
205
+ this.changed();
206
+ await (await this.manager()).signoutRedirect({ id_token_hint: user.id_token,
207
+ extraQueryParams: { client_id: this.options.clientId }, state: { sdk: 1, endedVersion } });
208
+ }
209
+ /** OIDC 库消费退出 state,迟到回跳不得清理后来建立的会话。 */
210
+ async handleLogoutCallback(url) {
211
+ const response = await (await this.manager()).signoutRedirectCallback(url);
212
+ const state = response.userState;
213
+ if (state?.sdk !== 1 || state.endedVersion !== this.sessions.read().version)
214
+ throw new HeimdallBrowserError('session_changed');
215
+ return { returnedFromSso: true };
216
+ }
217
+ /** 卸载时释放监听和自动续期计时器;不注销用户。 */
218
+ dispose() { clearTimeout(this.timer); window.removeEventListener('storage', this.storageHandler); document.removeEventListener('visibilitychange', this.visibilityHandler); this.listeners.clear(); }
219
+ async validate(user, verifyIdToken) {
220
+ let id;
221
+ if (verifyIdToken) {
222
+ if (!user.id_token)
223
+ throw new HeimdallBrowserError('id_token_missing');
224
+ id = await this.protocol.validateJwt(user.id_token, { idToken: true });
225
+ if (typeof id.sid !== 'string' || !id.sid)
226
+ throw new HeimdallBrowserError('invalid_identity');
227
+ user.profile = id;
228
+ }
229
+ if ((this.options.accessTokenFormat ?? 'jwt') === 'jwt') {
230
+ const claims = await this.protocol.validateJwt(user.access_token, { tokenType: 'UserLogin', subjectId: id?.sub, sessionId: typeof id?.sid === 'string' ? id.sid : undefined });
231
+ if (typeof claims.sid !== 'string' || !claims.sid)
232
+ throw new HeimdallBrowserError('invalid_identity');
233
+ }
234
+ // 已登录凭据的 ID Token 可早于 AT 到期;opaque 不以旧 ID Token 的到期时间替代 AT 寿命。
235
+ }
236
+ /** opaque 身份来自已签名 ID Token,角色权限不可从 opaque 解码。 */
237
+ identity(user) {
238
+ if ((this.options.accessTokenFormat ?? 'jwt') === 'jwt')
239
+ return displayIdentity(user.access_token);
240
+ if (typeof user.profile.sub !== 'string' || typeof user.profile.sid !== 'string')
241
+ throw new HeimdallBrowserError('invalid_identity');
242
+ return { issuer: this.options.authority, clientId: this.options.clientId, tenantId: this.options.tenantId,
243
+ applicationId: this.options.applicationId, subjectId: user.profile.sub, sessionId: user.profile.sid, roles: [], permissions: [] };
244
+ }
245
+ /** 完整凭据返回给调用方;Token 的取得时间与剩余有效期对应。 */
246
+ tokens(user) {
247
+ return { access_token: user.access_token, token_type: 'Bearer', expires_in: Math.max(0, user.expires_in ?? 0),
248
+ refresh_token: user.refresh_token, id_token: user.id_token, scope: user.scope, obtained_at: Date.now() };
249
+ }
250
+ /** 获取完整 Token 结果,业务可完全自行保存。 */
251
+ async getTokenSet() {
252
+ await this.getAccessToken();
253
+ const current = this.sessions.read();
254
+ if (!current.user)
255
+ throw new HeimdallBrowserError('not_authenticated');
256
+ return this.tokens(User.fromStorageString(current.user));
257
+ }
258
+ /** 设备码发起时绑定当前版本,退出或其它登录后不得覆盖它。 */
259
+ async requestDeviceAuthorization(signal) {
260
+ const version = this.sessions.read().version;
261
+ return { ...await this.protocol.requestDeviceAuthorization(signal), browserVersion: version };
262
+ }
263
+ /** 只尝试一次,成功后核对版本、校验身份并更新所选存储。 */
264
+ async exchangeDeviceCode(device, signal) {
265
+ return this.sessions.protocol(async () => {
266
+ const result = await this.protocol.exchangeDeviceCode(device, signal);
267
+ if (result.status === 'complete')
268
+ await this.acceptDeviceTokens(result.tokens, device.browserVersion);
269
+ return result;
270
+ });
271
+ }
272
+ /** 可取消轮询,收到 Token 后才提交浏览器凭据。 */
273
+ async waitForDeviceToken(device, signal) {
274
+ return this.sessions.protocol(async () => {
275
+ const tokens = await this.protocol.waitForDeviceToken(device, signal);
276
+ await this.acceptDeviceTokens(tokens, device.browserVersion);
277
+ return tokens;
278
+ });
279
+ }
280
+ async acceptDeviceTokens(tokens, version) {
281
+ if (!tokens.id_token)
282
+ throw new HeimdallBrowserError('id_token_missing');
283
+ const id = await this.protocol.validateJwt(tokens.id_token, { idToken: true });
284
+ const user = new User({ ...tokens, expires_at: Math.floor(tokens.obtained_at / 1000) + tokens.expires_in, profile: id });
285
+ await this.validate(user, true);
286
+ let previous = null;
287
+ await this.sessions.locked(() => {
288
+ const current = this.sessions.read();
289
+ if (current.user)
290
+ previous = User.fromStorageString(current.user);
291
+ this.sessions.commit(version, user.toStorageString());
292
+ });
293
+ this.changed();
294
+ if (previous)
295
+ await this.revoke(previous);
296
+ }
297
+ async endCaptured(captured, token) {
298
+ await this.sessions.locked(() => {
299
+ const current = this.sessions.read();
300
+ if (current.version === captured.version && current.user && User.fromStorageString(current.user).access_token === token)
301
+ this.sessions.commit(captured.version);
302
+ });
303
+ this.changed();
304
+ }
305
+ /** 读取完整响应体后再次核对版本,防止 headers 已到而 body 迟到时污染新账号界面。 */
306
+ guardResponse(response, version, token) {
307
+ const check = () => {
308
+ const current = this.sessions.read();
309
+ if (current.version !== version || !current.user || User.fromStorageString(current.user).access_token !== token)
310
+ throw new HeimdallBrowserError('session_changed');
311
+ };
312
+ for (const method of ['json', 'text', 'arrayBuffer', 'blob', 'formData']) {
313
+ const read = response[method].bind(response);
314
+ Object.defineProperty(response, method, { value: async () => { const result = await read(); check(); return result; } });
315
+ }
316
+ const clone = response.clone.bind(response);
317
+ Object.defineProperty(response, 'clone', { value: () => { check(); return this.guardResponse(clone(), version, token); } });
318
+ return response;
319
+ }
320
+ async revoke(user) {
321
+ try {
322
+ for (const type of ['refresh_token', 'access_token']) {
323
+ if (!user[type])
324
+ continue;
325
+ await this.protocol.revokeToken(user[type], type);
326
+ }
327
+ return true;
328
+ }
329
+ catch {
330
+ return false;
331
+ }
332
+ }
333
+ readSnapshot() {
334
+ const current = this.sessions.read();
335
+ let identity = null;
336
+ try {
337
+ if (current.user)
338
+ identity = this.identity(User.fromStorageString(current.user));
339
+ }
340
+ catch { /* 快照只包含可解析身份数据。 */ }
341
+ return { identity, version: current.version };
342
+ }
343
+ changed() { this.snapshot = this.readSnapshot(); this.scheduleRenew(); for (const listener of this.listeners)
344
+ listener(); }
345
+ scheduleRenew() {
346
+ clearTimeout(this.timer);
347
+ const current = this.sessions.read();
348
+ if (!this.automaticRenew || !current.user)
349
+ return;
350
+ const user = User.fromStorageString(current.user);
351
+ if (!user.refresh_token)
352
+ return;
353
+ this.timer = setTimeout(() => { void this.getAccessToken().catch(() => { }); }, Math.max(1000, ((user.expires_in ?? 0) - 60) * 1000));
354
+ }
355
+ trustedUrl(value) {
356
+ const url = new URL(value);
357
+ if (url.username || url.password || url.hash || !(url.protocol === 'https:'
358
+ || (this.options.allowLocalhostHttp && url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname))))
359
+ throw new HeimdallBrowserError('untrusted_url');
360
+ return url;
361
+ }
362
+ ensureResource(url) {
363
+ if (!(this.options.resourceBaseUrls ?? []).some(base => {
364
+ const allowed = this.trustedUrl(base);
365
+ return url.origin === allowed.origin && (url.pathname === allowed.pathname.replace(/\/$/, '') || url.pathname.startsWith(allowed.pathname.replace(/\/$/, '') + '/'));
366
+ }))
367
+ throw new HeimdallBrowserError('untrusted_resource');
368
+ }
369
+ validateOptions() {
370
+ for (const value of [this.options.authority, this.options.redirectUri, this.options.postLogoutRedirectUri,
371
+ ...(this.options.resourceBaseUrls ?? [])])
372
+ this.trustedUrl(value);
373
+ if (!this.options.clientId || !this.options.applicationId || !this.options.audience
374
+ || !(this.options.scope ?? 'openid').split(' ').includes('openid'))
375
+ throw new HeimdallBrowserError('invalid_configuration');
376
+ }
377
+ }
378
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { HeimdallBrowserClient } from './client.js';
2
+ export { HeimdallBrowserError } from './types.js';
3
+ export type { HeimdallBrowserOptions, HeimdallIdentity, HeimdallSnapshot, ApplicationLogoutResult } from './types.js';
4
+ export { hasAllPermissions } from './claims.js';
5
+ export { HeimdallProtocolClient } from './protocol.js';
6
+ export { HeimdallProtocolError } from './protocol-types.js';
7
+ export type { HeimdallProtocolOptions, HeimdallTokenSet, HeimdallLoginRequest, HeimdallLoginOptions, HeimdallDeviceAuthorization, HeimdallDeviceTokenResult, HeimdallJwtValidation } from './protocol-types.js';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { HeimdallBrowserClient } from './client.js';
2
+ export { HeimdallBrowserError } from './types.js';
3
+ export { hasAllPermissions } from './claims.js';
4
+ export { HeimdallProtocolClient } from './protocol.js';
5
+ export { HeimdallProtocolError } from './protocol-types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}