import { BaseClientProps, RequestProxyType, AuthStorageProxyType, AuthTokens, JWTIDToken } from './types'; import createRequest from './BaseRequest'; import createAuthLocal from './BaseAuthProxy'; import { isEmpty } from './util'; import jwtDecode from 'jwt-decode'; export abstract class BaseClient { props: BaseClientProps; request: RequestProxyType; authStorage: AuthStorageProxyType; constructor(props: BaseClientProps) { const authStorage = (props.authStorageProxy?.createAuthLocal || createAuthLocal)(); this.props = props; this.request = (props.requestProxy?.createRequest || createRequest)(authStorage); this.authStorage = authStorage; } setAuth(auth: AuthTokens): void { if (isEmpty(auth)) return; if (auth.id_token) { // node环境下多实例情况下只设置access_token时,没有id_token const user: JWTIDToken = jwtDecode(auth.id_token) as JWTIDToken; this.authStorage.setUser(user); } this.authStorage.setAuth(auth); } getAuth(): AuthTokens { return this.authStorage.getAuth(); } clearAuth(): void { return this.authStorage.clear(); } getUser(): JWTIDToken { return this.authStorage.getUser(); } /** * @name updateUser * @name_zh 更新用户信息 * @description 更新用户字段数据 * * @param {any} payload 更新的用户字段 * @example * authenticationClient.updateUser({phoneNumber: '176xxxx6754')} * * @returns {Promise} * @memberof AuthenticationClient */ async updateUser(payload: any): Promise { const user: JWTIDToken | null = this.authStorage.getUser(); if (!user?.sub) { console.error('缺少sub参数', user); throw new Error('缺少sub参数'); } const api = `${this.props.userDomain}/user/${user.sub}`; try { const res: any = await this.request.put(api, { data: { ...payload } }); // TODO: 此处statusCode为undefined,需要改为status if (res.statusCode === 200) { this.authStorage.setUser(Object.assign({}, user, res.data)); return res.data; } return Promise.reject(res); } catch (error) { throw error; } } /** * @name fetchUser * @name_zh 获取用户信息 * @description 接口获取用户信息 * * @param {string} token access_token * @example * authenticationClient.fetchUser(access_token) * * @returns {Promise} * @memberof AuthenticationClient */ async fetchUser(token: string): Promise { if (!token) { console.error('缺少token参数'); throw new Error('缺少token参数'); } const auth = this.getAuth() || {}; this.setAuth(Object.assign(auth, { access_token: token })); const api = `${this.props.userDomain}/userinfo`; try { const res: any = await this.request.get(api); // 此处statusCode为undefined,需要改为status if (res.status === 200) { return res.data; } return Promise.reject(res); } catch (error) { throw error; } } isAuthenticated(): boolean { return !isEmpty(this.authStorage.getAuth()); } }