From 2a0d508cf4752f3b44d6f657c00922d3cf3ae72e Mon Sep 17 00:00:00 2001 From: abearxiong Date: Sat, 21 Feb 2026 22:19:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B3=200.0.58=EF=BC=8C=E6=B7=BB=E5=8A=A0=20cnb=20=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=92=8C=E5=88=B7=E6=96=B0=E7=94=A8=E6=88=B7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- query/query-login/query-login.ts | 53 ++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 110d9cc..469e69a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/api", - "version": "0.0.57", + "version": "0.0.58", "description": "", "main": "mod.ts", "scripts": { diff --git a/query/query-login/query-login.ts b/query/query-login/query-login.ts index 82e15d0..a859d83 100644 --- a/query/query-login/query-login.ts +++ b/query/query-login/query-login.ts @@ -107,6 +107,26 @@ export class QueryLogin extends BaseQuery { } return res; } + /** + * cnb登录, 适用于cnb的登录方式, 需要后端配合, 传入cnbToken, 后端验证cnbToken的有效性,并返回accessToken和refreshToken + * @param data + * @returns + */ + async loginByCnb(data: { cnbToken: string }) { + const res = await this.post({ + path: 'user', + key: 'cnb-login', + payload: { + data: data + } + }); + if (res.code === 200) { + const { accessToken, refreshToken, accessTokenExpiresIn } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken, accessTokenExpiresIn }); + } + return res; + } /** * 检测微信登录,登陆成功后,调用onSuccess,否则调用onError * @param param0 @@ -154,13 +174,27 @@ export class QueryLogin extends BaseQuery { message: '登录失败', }; } + /** + * 刷新登录用户,获取新的token,并更新用户信息 + * @param refreshToken 刷新token,如果不传,则从缓存中获取 + * @returns + */ + async refreshLoginUser(refreshToken?: string) { + const res = await this.queryRefreshToken(refreshToken); + if (res.code === 200) { + const { accessToken, refreshToken, accessTokenExpiresIn } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken, accessTokenExpiresIn, check401: false }); + } + return res; + } /** * 刷新token * @param refreshToken * @returns */ async queryRefreshToken(refreshToken?: string) { - const _refreshToken = refreshToken || this.cacheStore.getRefreshToken(); + const _refreshToken = refreshToken || (await this.cacheStore.getRefreshToken()); let data = { refreshToken: _refreshToken }; if (!_refreshToken) { await this.cacheStore.clearCurrentUser(); @@ -311,8 +345,21 @@ export class QueryLogin extends BaseQuery { const token = this.storage.getItem('token'); return !!token; } - async checkTokenValid() { - return this.cacheStore.getIsExpired(); + async checkTokenValid(): Promise { + const token = this.storage.getItem('token'); + if (!token) { + return null; + } + const isExpired = await this.cacheStore.getIsExpired(); + if (isExpired) { + const res = await this.refreshLoginUser() + if (res.code === 200) { + // 刷新成功,返回新的token + return res.data?.accessToken || null; + } + return null; + } + return token; } /** * 检查本地用户列表