lgsso-sdk 1.0.97 → 1.0.99

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.
@@ -342,9 +342,10 @@ function createSSO() {
342
342
  /**
343
343
  * 用token换取新accessCode并跳转到指定URL
344
344
  * @param {string} redirectUrl - 目标跳转地址
345
+ * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
345
346
  * @returns {Promise<Object>} 接口返回结果
346
347
  */
347
- async toUrl(redirectUrl) {
348
+ async toUrl(redirectUrl, target = '_self') { // 新增target参数,默认当前页面
348
349
  if (!config) {
349
350
  return { code: -101, msg: '请先调用init方法初始化', success: false };
350
351
  }
@@ -353,6 +354,11 @@ function createSSO() {
353
354
  return { code: -104, msg: '请提供跳转地址', success: false };
354
355
  }
355
356
 
357
+ // 验证target参数有效性
358
+ if (!['_self', '_blank'].includes(target)) {
359
+ return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
360
+ }
361
+
356
362
  if (!config.refreshCodeApi) {
357
363
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
358
364
  }
@@ -360,8 +366,14 @@ function createSSO() {
360
366
  const token = this.getToken();
361
367
  if (!token) {
362
368
  if (isBrowser() && config.logOutUrl) {
363
- // 修改:使用参数传入的redirectUrl作为重定向地址
364
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
369
+ const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
370
+
371
+ // 根据target决定打开方式
372
+ if (target === '_blank') {
373
+ window.open(loginUrl, '_blank');
374
+ } else {
375
+ window.location.href = loginUrl;
376
+ }
365
377
  }
366
378
  return { code: -106, msg: '未找到有效token', success: false };
367
379
  }
@@ -379,7 +391,14 @@ function createSSO() {
379
391
  if (result.code === 0 && result.data && isBrowser()) {
380
392
  const url = new URL(redirectUrl);
381
393
  url.searchParams.set(config.accessCodeKey, result.data);
382
- window.location.href = url.toString();
394
+ const targetUrl = url.toString();
395
+
396
+ // 根据target参数决定跳转方式
397
+ if (target === '_blank') {
398
+ window.open(targetUrl, '_blank');
399
+ } else {
400
+ window.location.href = targetUrl;
401
+ }
383
402
  }
384
403
 
385
404
  return result;
@@ -387,7 +406,6 @@ function createSSO() {
387
406
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
388
407
  }
389
408
  },
390
-
391
409
  /**
392
410
  * 获取accessCode(通过token换取)
393
411
  * @returns {Promise<Object>} 接口返回结果(data为accessCode)
@@ -338,9 +338,10 @@ function createSSO() {
338
338
  /**
339
339
  * 用token换取新accessCode并跳转到指定URL
340
340
  * @param {string} redirectUrl - 目标跳转地址
341
+ * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
341
342
  * @returns {Promise<Object>} 接口返回结果
342
343
  */
343
- async toUrl(redirectUrl) {
344
+ async toUrl(redirectUrl, target = '_self') { // 新增target参数,默认当前页面
344
345
  if (!config) {
345
346
  return { code: -101, msg: '请先调用init方法初始化', success: false };
346
347
  }
@@ -349,6 +350,11 @@ function createSSO() {
349
350
  return { code: -104, msg: '请提供跳转地址', success: false };
350
351
  }
351
352
 
353
+ // 验证target参数有效性
354
+ if (!['_self', '_blank'].includes(target)) {
355
+ return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
356
+ }
357
+
352
358
  if (!config.refreshCodeApi) {
353
359
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
354
360
  }
@@ -356,8 +362,14 @@ function createSSO() {
356
362
  const token = this.getToken();
357
363
  if (!token) {
358
364
  if (isBrowser() && config.logOutUrl) {
359
- // 修改:使用参数传入的redirectUrl作为重定向地址
360
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
365
+ const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
366
+
367
+ // 根据target决定打开方式
368
+ if (target === '_blank') {
369
+ window.open(loginUrl, '_blank');
370
+ } else {
371
+ window.location.href = loginUrl;
372
+ }
361
373
  }
362
374
  return { code: -106, msg: '未找到有效token', success: false };
363
375
  }
@@ -375,7 +387,14 @@ function createSSO() {
375
387
  if (result.code === 0 && result.data && isBrowser()) {
376
388
  const url = new URL(redirectUrl);
377
389
  url.searchParams.set(config.accessCodeKey, result.data);
378
- window.location.href = url.toString();
390
+ const targetUrl = url.toString();
391
+
392
+ // 根据target参数决定跳转方式
393
+ if (target === '_blank') {
394
+ window.open(targetUrl, '_blank');
395
+ } else {
396
+ window.location.href = targetUrl;
397
+ }
379
398
  }
380
399
 
381
400
  return result;
@@ -383,7 +402,6 @@ function createSSO() {
383
402
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
384
403
  }
385
404
  },
386
-
387
405
  /**
388
406
  * 获取accessCode(通过token换取)
389
407
  * @returns {Promise<Object>} 接口返回结果(data为accessCode)
package/dist/lgsso-sdk.js CHANGED
@@ -344,9 +344,10 @@
344
344
  /**
345
345
  * 用token换取新accessCode并跳转到指定URL
346
346
  * @param {string} redirectUrl - 目标跳转地址
347
+ * @param {string} target - 当前页面:_self、新页面打开:_blank,默认当前页_self
347
348
  * @returns {Promise<Object>} 接口返回结果
348
349
  */
349
- async toUrl(redirectUrl) {
350
+ async toUrl(redirectUrl, target = '_self') { // 新增target参数,默认当前页面
350
351
  if (!config) {
351
352
  return { code: -101, msg: '请先调用init方法初始化', success: false };
352
353
  }
@@ -355,6 +356,11 @@
355
356
  return { code: -104, msg: '请提供跳转地址', success: false };
356
357
  }
357
358
 
359
+ // 验证target参数有效性
360
+ if (!['_self', '_blank'].includes(target)) {
361
+ return { code: -108, msg: 'target参数必须是"_self"或"_blank"', success: false };
362
+ }
363
+
358
364
  if (!config.refreshCodeApi) {
359
365
  return { code: -105, msg: '未配置refreshCodeApi', success: false };
360
366
  }
@@ -362,8 +368,14 @@
362
368
  const token = this.getToken();
363
369
  if (!token) {
364
370
  if (isBrowser() && config.logOutUrl) {
365
- // 修改:使用参数传入的redirectUrl作为重定向地址
366
- window.location.href = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
371
+ const loginUrl = `${config.logOutUrl}?redirect_uri=${encodeURIComponent(redirectUrl)}`;
372
+
373
+ // 根据target决定打开方式
374
+ if (target === '_blank') {
375
+ window.open(loginUrl, '_blank');
376
+ } else {
377
+ window.location.href = loginUrl;
378
+ }
367
379
  }
368
380
  return { code: -106, msg: '未找到有效token', success: false };
369
381
  }
@@ -381,7 +393,14 @@
381
393
  if (result.code === 0 && result.data && isBrowser()) {
382
394
  const url = new URL(redirectUrl);
383
395
  url.searchParams.set(config.accessCodeKey, result.data);
384
- window.location.href = url.toString();
396
+ const targetUrl = url.toString();
397
+
398
+ // 根据target参数决定跳转方式
399
+ if (target === '_blank') {
400
+ window.open(targetUrl, '_blank');
401
+ } else {
402
+ window.location.href = targetUrl;
403
+ }
385
404
  }
386
405
 
387
406
  return result;
@@ -389,7 +408,6 @@
389
408
  return { code: -107, msg: `跳转失败: ${error.message}`, success: false };
390
409
  }
391
410
  },
392
-
393
411
  /**
394
412
  * 获取accessCode(通过token换取)
395
413
  * @returns {Promise<Object>} 接口返回结果(data为accessCode)
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).lgsso={})}(this,function(e){"use strict";function t(){return"undefined"!=typeof window&&"undefined"!=typeof document}function o(){return t()?window.location.href:""}async function s(e,{method:o="GET",data:s={},headers:n={},timeout:r=5e3}={}){if(!t())return{code:-200,msg:"request方法只能在浏览器环境使用",success:!1};const c=new AbortController,i=setTimeout(()=>c.abort(),r),a={method:o.toUpperCase(),headers:{"Content-Type":"application/json",...n},signal:c.signal};"GET"!==a.method&&s&&(a.body=JSON.stringify(s));try{const t=await fetch(e,a);if(clearTimeout(i),!t.ok)return{code:t.status,msg:`HTTP请求失败: ${t.statusText}`,success:!1};try{return await t.json()}catch(e){return{code:-201,msg:"响应数据不是有效的JSON格式",success:!1}}}catch(e){return clearTimeout(i),"AbortError"===e.name?{code:-202,msg:`请求超时(${r}ms)`,success:!1}:{code:-203,msg:`网络请求失败: ${e.message}`,success:!1}}}const n={accessCodeKey:"accessCode",tokenKey:"scm_token",timeout:5e3,headers:{},tokenApi:"",refreshCodeApi:"",logoutApi:"",logOutUrl:"",storage:localStorage};let r=null;function c(){return{async init(e={}){try{r=function(e,t){if(!t)return{...e};const o={...e};for(const e in t)t.hasOwnProperty(e)&&(o[e]=t[e]);return o}(n,e),function(e){if("string"!=typeof e.accessCodeKey||""===e.accessCodeKey.trim())throw new Error("accessCodeKey必须是有效的字符串");if("string"!=typeof e.tokenKey||""===e.tokenKey.trim())throw new Error("tokenKey必须是有效的字符串");if(e.storage&&("function"!=typeof e.storage.setItem||"function"!=typeof e.storage.getItem))throw new Error("storage必须实现setItem和getItem方法")}(r);const c=function(e,o){if(!t())return null;const s=o||window.location.href,n=new URL(s);let r=n.searchParams.get(e);if(null!==r)return r;if(n.hash.includes("?")){const t=n.hash.split("?")[1];return new URLSearchParams(t).get(e)}return null}(r.accessCodeKey);if(!r.tokenApi)return{code:-100,msg:"缺少tokenApi配置",success:!1};if(c){const e=await s(r.tokenApi,{method:"POST",data:{accessCode:c},headers:r.headers,timeout:r.timeout});return 0===e.code&&e.data&&(r.storage.setItem(r.tokenKey,e.data),function(e){if(!t())return;const o=new URL(window.location.href);let s,n;if(o.hash.includes("?")){const[t,r]=o.hash.split("?");if(s=new URLSearchParams(r),s.has(e)){s.delete(e);const r=s.toString()?`${t}?${s.toString()}`:t;o.hash=r,n=o.toString()}}else s=new URLSearchParams(o.search),s.has(e)&&(s.delete(e),o.search=s.toString(),n=o.toString());n&&n!==window.location.href&&window.location.replace(n)}(r.accessCodeKey)),e}return this.getToken()||t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(o())}`),{code:0,msg:"初始化成功",success:!0}}catch(e){return{code:-100,msg:`初始化失败: ${e.message}`,success:!1}}},getToken:()=>r&&t()?r.storage.getItem(r.tokenKey):null,removeToken(){r&&t()&&r.storage.removeItem(r.tokenKey)},async logout(){if(!r)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!r.logoutApi)return{code:-102,msg:"未配置logoutApi",success:!1};const e=this.getToken();if(!e)return this.removeToken(),t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(o())}`),{code:0,msg:"已成功清除token",success:!0};try{const n=await s(r.logoutApi,{method:"POST",headers:{...r.headers,[r.tokenKey]:e},timeout:r.timeout});return this.removeToken(),t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(o())}`),n}catch(e){return{code:-103,msg:`退出失败: ${e.message}`,success:!1}}},async toUrl(e){if(!r)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!e)return{code:-104,msg:"请提供跳转地址",success:!1};if(!r.refreshCodeApi)return{code:-105,msg:"未配置refreshCodeApi",success:!1};const o=this.getToken();if(!o)return t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(e)}`),{code:-106,msg:"未找到有效token",success:!1};try{const n=await s(r.refreshCodeApi,{method:"POST",headers:{...r.headers,[r.tokenKey]:o},timeout:r.timeout});if(0===n.code&&n.data&&t()){const t=new URL(e);t.searchParams.set(r.accessCodeKey,n.data),window.location.href=t.toString()}return n}catch(e){return{code:-107,msg:`跳转失败: ${e.message}`,success:!1}}},async getAccessCode(){if(!r)return{code:-101,msg:"请先调用init方法初始化",success:!1};const e=this.getToken();return e?r.refreshCodeApi?s(r.refreshCodeApi,{method:"POST",headers:{...r.headers,[r.tokenKey]:e},timeout:r.timeout}):{code:-105,msg:"未配置refreshCodeApi",success:!1}:{code:-106,msg:"未找到有效token",success:!1}},getConfig:()=>({...r})}}const i=c();e.createSSO=c,e.default=i,e.lgsso=i,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).lgsso={})}(this,function(e){"use strict";function t(){return"undefined"!=typeof window&&"undefined"!=typeof document}function o(){return t()?window.location.href:""}async function s(e,{method:o="GET",data:s={},headers:n={},timeout:r=5e3}={}){if(!t())return{code:-200,msg:"request方法只能在浏览器环境使用",success:!1};const c=new AbortController,i=setTimeout(()=>c.abort(),r),a={method:o.toUpperCase(),headers:{"Content-Type":"application/json",...n},signal:c.signal};"GET"!==a.method&&s&&(a.body=JSON.stringify(s));try{const t=await fetch(e,a);if(clearTimeout(i),!t.ok)return{code:t.status,msg:`HTTP请求失败: ${t.statusText}`,success:!1};try{return await t.json()}catch(e){return{code:-201,msg:"响应数据不是有效的JSON格式",success:!1}}}catch(e){return clearTimeout(i),"AbortError"===e.name?{code:-202,msg:`请求超时(${r}ms)`,success:!1}:{code:-203,msg:`网络请求失败: ${e.message}`,success:!1}}}const n={accessCodeKey:"accessCode",tokenKey:"scm_token",timeout:5e3,headers:{},tokenApi:"",refreshCodeApi:"",logoutApi:"",logOutUrl:"",storage:localStorage};let r=null;function c(){return{async init(e={}){try{r=function(e,t){if(!t)return{...e};const o={...e};for(const e in t)t.hasOwnProperty(e)&&(o[e]=t[e]);return o}(n,e),function(e){if("string"!=typeof e.accessCodeKey||""===e.accessCodeKey.trim())throw new Error("accessCodeKey必须是有效的字符串");if("string"!=typeof e.tokenKey||""===e.tokenKey.trim())throw new Error("tokenKey必须是有效的字符串");if(e.storage&&("function"!=typeof e.storage.setItem||"function"!=typeof e.storage.getItem))throw new Error("storage必须实现setItem和getItem方法")}(r);const c=function(e,o){if(!t())return null;const s=o||window.location.href,n=new URL(s);let r=n.searchParams.get(e);if(null!==r)return r;if(n.hash.includes("?")){const t=n.hash.split("?")[1];return new URLSearchParams(t).get(e)}return null}(r.accessCodeKey);if(!r.tokenApi)return{code:-100,msg:"缺少tokenApi配置",success:!1};if(c){const e=await s(r.tokenApi,{method:"POST",data:{accessCode:c},headers:r.headers,timeout:r.timeout});return 0===e.code&&e.data&&(r.storage.setItem(r.tokenKey,e.data),function(e){if(!t())return;const o=new URL(window.location.href);let s,n;if(o.hash.includes("?")){const[t,r]=o.hash.split("?");if(s=new URLSearchParams(r),s.has(e)){s.delete(e);const r=s.toString()?`${t}?${s.toString()}`:t;o.hash=r,n=o.toString()}}else s=new URLSearchParams(o.search),s.has(e)&&(s.delete(e),o.search=s.toString(),n=o.toString());n&&n!==window.location.href&&window.location.replace(n)}(r.accessCodeKey)),e}return this.getToken()||t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(o())}`),{code:0,msg:"初始化成功",success:!0}}catch(e){return{code:-100,msg:`初始化失败: ${e.message}`,success:!1}}},getToken:()=>r&&t()?r.storage.getItem(r.tokenKey):null,removeToken(){r&&t()&&r.storage.removeItem(r.tokenKey)},async logout(){if(!r)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!r.logoutApi)return{code:-102,msg:"未配置logoutApi",success:!1};const e=this.getToken();if(!e)return this.removeToken(),t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(o())}`),{code:0,msg:"已成功清除token",success:!0};try{const n=await s(r.logoutApi,{method:"POST",headers:{...r.headers,[r.tokenKey]:e},timeout:r.timeout});return this.removeToken(),t()&&r.logOutUrl&&(window.location.href=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(o())}`),n}catch(e){return{code:-103,msg:`退出失败: ${e.message}`,success:!1}}},async toUrl(e,o="_self"){if(!r)return{code:-101,msg:"请先调用init方法初始化",success:!1};if(!e)return{code:-104,msg:"请提供跳转地址",success:!1};if(!["_self","_blank"].includes(o))return{code:-108,msg:'target参数必须是"_self"或"_blank"',success:!1};if(!r.refreshCodeApi)return{code:-105,msg:"未配置refreshCodeApi",success:!1};const n=this.getToken();if(!n){if(t()&&r.logOutUrl){const t=`${r.logOutUrl}?redirect_uri=${encodeURIComponent(e)}`;"_blank"===o?window.open(t,"_blank"):window.location.href=t}return{code:-106,msg:"未找到有效token",success:!1}}try{const c=await s(r.refreshCodeApi,{method:"POST",headers:{...r.headers,[r.tokenKey]:n},timeout:r.timeout});if(0===c.code&&c.data&&t()){const t=new URL(e);t.searchParams.set(r.accessCodeKey,c.data);const s=t.toString();"_blank"===o?window.open(s,"_blank"):window.location.href=s}return c}catch(e){return{code:-107,msg:`跳转失败: ${e.message}`,success:!1}}},async getAccessCode(){if(!r)return{code:-101,msg:"请先调用init方法初始化",success:!1};const e=this.getToken();return e?r.refreshCodeApi?s(r.refreshCodeApi,{method:"POST",headers:{...r.headers,[r.tokenKey]:e},timeout:r.timeout}):{code:-105,msg:"未配置refreshCodeApi",success:!1}:{code:-106,msg:"未找到有效token",success:!1}},getConfig:()=>({...r})}}const i=c();e.createSSO=c,e.default=i,e.lgsso=i,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=lgsso-sdk.min.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lgsso-sdk",
3
- "version": "1.0.97",
3
+ "version": "1.0.99",
4
4
  "type": "module",
5
5
  "description": "无框架依赖的单点登录SDK",
6
6
  "main": "dist/lgsso-sdk.cjs",