调整composeAccessPath方法,出现多域名情况
This commit is contained in:
parent
246db21ab6
commit
049e1bef32
|
|
@ -551,7 +551,7 @@ export async function verifyPassword(params, context) {
|
|||
}, {});
|
||||
}
|
||||
export async function loginByAccount(params, context) {
|
||||
const { account, password, env, } = params;
|
||||
const { account, password, env } = params;
|
||||
let needUpdatePassword = false;
|
||||
const loginLogic = async () => {
|
||||
const systemId = context.getSystemId();
|
||||
|
|
@ -621,6 +621,7 @@ export async function loginByAccount(params, context) {
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
email$user: {
|
||||
$entity: 'email',
|
||||
data: {
|
||||
|
|
@ -678,7 +679,7 @@ export async function loginByAccount(params, context) {
|
|||
const allowEmail = !!applicationPassports.find((ele) => ele.passport?.type === 'email');
|
||||
const [userRow] = result;
|
||||
const { email$user, id: userId, } = userRow;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
if (allowEmail) {
|
||||
const email = email$user?.find(ele => ele.email.toLowerCase() === account.toLowerCase());
|
||||
if (email) {
|
||||
|
|
@ -724,6 +725,7 @@ export async function loginByAccount(params, context) {
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
mobile$user: {
|
||||
$entity: 'mobile',
|
||||
data: {
|
||||
|
|
@ -780,7 +782,7 @@ export async function loginByAccount(params, context) {
|
|||
});
|
||||
const [userRow] = result;
|
||||
const { mobile$user, id: userId, } = userRow;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
const allowSms = !!applicationPassports.find((ele) => ele.passport?.type === 'sms');
|
||||
if (allowSms) {
|
||||
const mobile = mobile$user?.find(ele => ele.mobile === account);
|
||||
|
|
@ -827,6 +829,7 @@ export async function loginByAccount(params, context) {
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
loginName$user: {
|
||||
$entity: 'loginName',
|
||||
data: {
|
||||
|
|
@ -862,7 +865,7 @@ export async function loginByAccount(params, context) {
|
|||
}
|
||||
case 1: {
|
||||
const [userRow] = result;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
const { loginName$user, id: userId, } = userRow;
|
||||
const loginName = loginName$user?.find((ele) => ele.name.toLowerCase() === account.toLowerCase());
|
||||
if (loginName) {
|
||||
|
|
@ -915,8 +918,9 @@ export async function loginByAccount(params, context) {
|
|||
await context.operate('user', {
|
||||
id: await generateNewIdAsync(),
|
||||
action: 'update',
|
||||
data: password ? {
|
||||
data: needUpdatePassword ? {
|
||||
password,
|
||||
passwordSha1: encryptPasswordSha1(password),
|
||||
verifyPasswordAt: Date.now(),
|
||||
} : {
|
||||
verifyPasswordAt: Date.now(),
|
||||
|
|
@ -2523,8 +2527,8 @@ export async function refreshToken(params, context) {
|
|||
// 只有server模式去刷新token
|
||||
// 'development' | 'production' | 'staging'
|
||||
const intervals = {
|
||||
development: 7200 * 1000,
|
||||
staging: 600 * 1000,
|
||||
development: 7200 * 1000, // 2小时
|
||||
staging: 600 * 1000, // 十分钟
|
||||
production: 600 * 1000, // 十分钟
|
||||
};
|
||||
let applicationId = token.applicationId;
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "applicationPassport", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "system", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "platform", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const checkers: (import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "parasite", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "mobile", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "applicationPassport", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "platform", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "system", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "message", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "user", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "application", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "address", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "token", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Checker<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").RuntimeCxt<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default checkers;
|
||||
|
|
|
|||
|
|
@ -1,28 +1,5 @@
|
|||
const SEND_KEY = 'captcha:sendAt';
|
||||
const SEND_CAPTCHA_LATENCY = process.env.NODE_ENV === 'development' ? 10 : 60;
|
||||
export default OakComponent({
|
||||
isList: false,
|
||||
// entity: 'user',
|
||||
// projection: {
|
||||
// id: 1,
|
||||
// name: 1,
|
||||
// nickname: 1,
|
||||
// mobile$user: {
|
||||
// $entity: 'mobile',
|
||||
// data: {
|
||||
// id: 1,
|
||||
// mobile: 1,
|
||||
// },
|
||||
// filter: {
|
||||
// ableState: 'enabled'
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
// formData: function ({ data: user, features, props }) {
|
||||
// return {
|
||||
// user,
|
||||
// };
|
||||
// },
|
||||
data: {
|
||||
channels: [],
|
||||
loading: false,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Style } from '../../../../types/Style';
|
||||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../../../oak-app-domain").EntityDict, keyof import("../../../../oak-app-domain").EntityDict, false, {
|
||||
style: Style;
|
||||
entity: "platform" | "application" | "system";
|
||||
entity: "application" | "system" | "platform";
|
||||
entityId: string;
|
||||
name: string;
|
||||
}>) => React.ReactElement;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
|
|||
type?: ButtonProps['type'] | AmButtonProps['type'];
|
||||
executeText?: string | undefined;
|
||||
buttonProps?: (ButtonProps & {
|
||||
color?: "default" | "success" | "primary" | "danger" | "warning" | undefined;
|
||||
color?: "default" | "success" | "primary" | "warning" | "danger" | undefined;
|
||||
fill?: "none" | "outline" | "solid" | undefined;
|
||||
size?: "small" | "middle" | "large" | "mini" | undefined;
|
||||
block?: boolean | undefined;
|
||||
|
|
@ -24,7 +24,7 @@ declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends key
|
|||
loadingIcon?: import("react").ReactNode;
|
||||
disabled?: boolean | undefined;
|
||||
onClick?: ((event: import("react").MouseEvent<HTMLButtonElement, MouseEvent>) => unknown) | undefined;
|
||||
type?: "submit" | "reset" | "button" | undefined;
|
||||
type?: "button" | "submit" | "reset" | undefined;
|
||||
shape?: "default" | "rounded" | "rectangular" | undefined;
|
||||
children?: import("react").ReactNode;
|
||||
} & Pick<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement>, "id" | "onMouseDown" | "onMouseUp" | "onTouchEnd" | "onTouchStart"> & {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import { encryptPasswordSha1 } from '../../../../utils/password';
|
||||
export default OakComponent({
|
||||
entity: 'user',
|
||||
projection: {
|
||||
|
|
@ -77,7 +78,7 @@ export default OakComponent({
|
|||
},
|
||||
async commit() {
|
||||
const { pwd } = this.state;
|
||||
this.update({ password: pwd });
|
||||
this.update({ password: pwd, passwordSha1: encryptPasswordSha1(pwd) });
|
||||
await this.execute();
|
||||
this.setState({
|
||||
successful: true,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { EntityDict } from '../../../oak-app-domain';
|
||||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<EntityDict, keyof EntityDict, false, {
|
||||
type: "bind" | "login";
|
||||
type: "login" | "bind";
|
||||
url: string;
|
||||
size: undefined;
|
||||
}>) => React.ReactElement;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ export declare abstract class BackendRuntimeContext<ED extends EntityDict & Base
|
|||
isReallyRoot(): boolean;
|
||||
sendMessage(data: ED['message']['CreateOperationData']): Promise<import("oak-domain/lib/types").OperationResult<ED>>;
|
||||
allowUserUpdate(): boolean;
|
||||
protected sortDomains(domains: ED['domain']['Schema'][]): ED['domain']['Schema'][];
|
||||
/**
|
||||
* 获得当前系统的访问路径,根据application/system/domain之间的关联
|
||||
* http://www.xxx.com/oak-api
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import { cloneDeep, unset } from 'oak-domain/lib/utils/lodash';
|
|||
import { composeServerUrl } from '../utils/domain';
|
||||
import { maskPassword } from '../utils/user';
|
||||
import { compareVersion } from 'oak-domain/lib/utils/version';
|
||||
import { isIP } from 'oak-domain/lib/utils/validator';
|
||||
/**
|
||||
* general数据结构要求的后台上下文
|
||||
*/
|
||||
|
|
@ -406,17 +407,39 @@ export class BackendRuntimeContext extends BRC {
|
|||
}
|
||||
throw new OakUnloggedInException('您尚未登录');
|
||||
}
|
||||
sortDomains(domains) {
|
||||
return domains.sort((a, b) => {
|
||||
const getPriority = (domain) => {
|
||||
if (typeof domain.url !== 'string')
|
||||
return 3;
|
||||
const lowerItem = domain.url.toLowerCase();
|
||||
// 1. 检查是否是localhost
|
||||
if (lowerItem === 'localhost')
|
||||
return 2;
|
||||
// 2. 检查是否是IPv4或IPv6
|
||||
if (isIP(domain.url))
|
||||
return 1;
|
||||
// 3. 其他情况认为是域名
|
||||
return 0;
|
||||
};
|
||||
return getPriority(a) - getPriority(b);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 获得当前系统的访问路径,根据application/system/domain之间的关联
|
||||
* http://www.xxx.com/oak-api
|
||||
*/
|
||||
composeAccessPath() {
|
||||
const application = this.getApplication();
|
||||
const { system } = application;
|
||||
const { system, domainId, domain } = application;
|
||||
if (domainId) {
|
||||
assert(domain);
|
||||
return composeServerUrl(domain);
|
||||
}
|
||||
const { domain$system: domains } = system;
|
||||
assert(domains && domains.length === 1);
|
||||
const [domain] = domains;
|
||||
return composeServerUrl(domain);
|
||||
assert(domains && domains.length > 0);
|
||||
const findDomain = this.sortDomains(domains)?.[0];
|
||||
return composeServerUrl(findDomain);
|
||||
}
|
||||
async tryDeduceException(err) {
|
||||
if (this.application && this.appVersion) {
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ async function createSession(params, context) {
|
|||
origin: 'wechat',
|
||||
type: 'image',
|
||||
tag1: 'image',
|
||||
objectId: await (0, uuid_1.generateNewIdAsync)(),
|
||||
objectId: await (0, uuid_1.generateNewIdAsync)(), // 这个域用来标识唯一性
|
||||
sort: 1000,
|
||||
uploadState: 'success',
|
||||
extra1: data.MediaId,
|
||||
|
|
@ -131,7 +131,7 @@ async function createSession(params, context) {
|
|||
origin: 'wechat',
|
||||
type: 'video',
|
||||
tag1: 'video',
|
||||
objectId: await (0, uuid_1.generateNewIdAsync)(),
|
||||
objectId: await (0, uuid_1.generateNewIdAsync)(), // 这个域用来标识唯一性
|
||||
sort: 1000,
|
||||
uploadState: 'success',
|
||||
extra1: data.MediaId,
|
||||
|
|
@ -153,7 +153,7 @@ async function createSession(params, context) {
|
|||
origin: 'wechat',
|
||||
type: 'audio',
|
||||
tag1: 'audio',
|
||||
objectId: await (0, uuid_1.generateNewIdAsync)(),
|
||||
objectId: await (0, uuid_1.generateNewIdAsync)(), // 这个域用来标识唯一性
|
||||
sort: 1000,
|
||||
uploadState: 'success',
|
||||
extra1: data.MediaId,
|
||||
|
|
|
|||
|
|
@ -557,7 +557,7 @@ async function verifyPassword(params, context) {
|
|||
}
|
||||
exports.verifyPassword = verifyPassword;
|
||||
async function loginByAccount(params, context) {
|
||||
const { account, password, env, } = params;
|
||||
const { account, password, env } = params;
|
||||
let needUpdatePassword = false;
|
||||
const loginLogic = async () => {
|
||||
const systemId = context.getSystemId();
|
||||
|
|
@ -627,6 +627,7 @@ async function loginByAccount(params, context) {
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
email$user: {
|
||||
$entity: 'email',
|
||||
data: {
|
||||
|
|
@ -684,7 +685,7 @@ async function loginByAccount(params, context) {
|
|||
const allowEmail = !!applicationPassports.find((ele) => ele.passport?.type === 'email');
|
||||
const [userRow] = result;
|
||||
const { email$user, id: userId, } = userRow;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
if (allowEmail) {
|
||||
const email = email$user?.find(ele => ele.email.toLowerCase() === account.toLowerCase());
|
||||
if (email) {
|
||||
|
|
@ -730,6 +731,7 @@ async function loginByAccount(params, context) {
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
mobile$user: {
|
||||
$entity: 'mobile',
|
||||
data: {
|
||||
|
|
@ -786,7 +788,7 @@ async function loginByAccount(params, context) {
|
|||
});
|
||||
const [userRow] = result;
|
||||
const { mobile$user, id: userId, } = userRow;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
const allowSms = !!applicationPassports.find((ele) => ele.passport?.type === 'sms');
|
||||
if (allowSms) {
|
||||
const mobile = mobile$user?.find(ele => ele.mobile === account);
|
||||
|
|
@ -833,6 +835,7 @@ async function loginByAccount(params, context) {
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
loginName$user: {
|
||||
$entity: 'loginName',
|
||||
data: {
|
||||
|
|
@ -868,7 +871,7 @@ async function loginByAccount(params, context) {
|
|||
}
|
||||
case 1: {
|
||||
const [userRow] = result;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
const { loginName$user, id: userId, } = userRow;
|
||||
const loginName = loginName$user?.find((ele) => ele.name.toLowerCase() === account.toLowerCase());
|
||||
if (loginName) {
|
||||
|
|
@ -921,8 +924,9 @@ async function loginByAccount(params, context) {
|
|||
await context.operate('user', {
|
||||
id: await (0, uuid_1.generateNewIdAsync)(),
|
||||
action: 'update',
|
||||
data: password ? {
|
||||
data: needUpdatePassword ? {
|
||||
password,
|
||||
passwordSha1: (0, password_1.encryptPasswordSha1)(password),
|
||||
verifyPasswordAt: Date.now(),
|
||||
} : {
|
||||
verifyPasswordAt: Date.now(),
|
||||
|
|
@ -2545,8 +2549,8 @@ async function refreshToken(params, context) {
|
|||
// 只有server模式去刷新token
|
||||
// 'development' | 'production' | 'staging'
|
||||
const intervals = {
|
||||
development: 7200 * 1000,
|
||||
staging: 600 * 1000,
|
||||
development: 7200 * 1000, // 2小时
|
||||
staging: 600 * 1000, // 十分钟
|
||||
production: 600 * 1000, // 十分钟
|
||||
};
|
||||
let applicationId = token.applicationId;
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ async function createWechatQrCode(options, context) {
|
|||
permanent,
|
||||
url,
|
||||
expired: false,
|
||||
expiresAt: Date.now() + 2592000 * 1000,
|
||||
expiresAt: Date.now() + 2592000 * 1000, // wecharQrCode里的过期时间都放到最大,由上层关联对象来主动过期(by Xc, 20230131)
|
||||
props,
|
||||
};
|
||||
// 直接创建
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ export declare abstract class BackendRuntimeContext<ED extends EntityDict & Base
|
|||
isReallyRoot(): boolean;
|
||||
sendMessage(data: ED['message']['CreateOperationData']): Promise<import("oak-domain/lib/types").OperationResult<ED>>;
|
||||
allowUserUpdate(): boolean;
|
||||
protected sortDomains(domains: ED['domain']['Schema'][]): ED['domain']['Schema'][];
|
||||
/**
|
||||
* 获得当前系统的访问路径,根据application/system/domain之间的关联
|
||||
* http://www.xxx.com/oak-api
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ const lodash_1 = require("oak-domain/lib/utils/lodash");
|
|||
const domain_1 = require("../utils/domain");
|
||||
const user_1 = require("../utils/user");
|
||||
const version_1 = require("oak-domain/lib/utils/version");
|
||||
const validator_1 = require("oak-domain/lib/utils/validator");
|
||||
/**
|
||||
* general数据结构要求的后台上下文
|
||||
*/
|
||||
|
|
@ -409,17 +410,39 @@ class BackendRuntimeContext extends BackendRuntimeContext_1.BackendRuntimeContex
|
|||
}
|
||||
throw new Exception_2.OakUnloggedInException('您尚未登录');
|
||||
}
|
||||
sortDomains(domains) {
|
||||
return domains.sort((a, b) => {
|
||||
const getPriority = (domain) => {
|
||||
if (typeof domain.url !== 'string')
|
||||
return 3;
|
||||
const lowerItem = domain.url.toLowerCase();
|
||||
// 1. 检查是否是localhost
|
||||
if (lowerItem === 'localhost')
|
||||
return 2;
|
||||
// 2. 检查是否是IPv4或IPv6
|
||||
if ((0, validator_1.isIP)(domain.url))
|
||||
return 1;
|
||||
// 3. 其他情况认为是域名
|
||||
return 0;
|
||||
};
|
||||
return getPriority(a) - getPriority(b);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 获得当前系统的访问路径,根据application/system/domain之间的关联
|
||||
* http://www.xxx.com/oak-api
|
||||
*/
|
||||
composeAccessPath() {
|
||||
const application = this.getApplication();
|
||||
const { system } = application;
|
||||
const { system, domainId, domain } = application;
|
||||
if (domainId) {
|
||||
(0, assert_1.assert)(domain);
|
||||
return (0, domain_1.composeServerUrl)(domain);
|
||||
}
|
||||
const { domain$system: domains } = system;
|
||||
(0, assert_1.assert)(domains && domains.length === 1);
|
||||
const [domain] = domains;
|
||||
return (0, domain_1.composeServerUrl)(domain);
|
||||
(0, assert_1.assert)(domains && domains.length > 0);
|
||||
const findDomain = this.sortDomains(domains)?.[0];
|
||||
return (0, domain_1.composeServerUrl)(findDomain);
|
||||
}
|
||||
async tryDeduceException(err) {
|
||||
if (this.application && this.appVersion) {
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ async function sendNotification(notification, context) {
|
|||
await instance.sendSubscribedMessage({
|
||||
templateId: templateId,
|
||||
data: data,
|
||||
openId: data1.openId,
|
||||
openId: data1.openId, // 在notification创建时就赋值了
|
||||
page,
|
||||
state: StateDict[process.env.NODE_ENV],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ export declare function createToDo<ED extends EntityDict & BaseEntityDict, T ext
|
|||
redirectTo: EntityDict['toDo']['OpSchema']['redirectTo'];
|
||||
entity: any;
|
||||
entityId: string;
|
||||
}, userIds?: string[]): Promise<1 | 0>;
|
||||
}, userIds?: string[]): Promise<0 | 1>;
|
||||
/**
|
||||
* 完成todo例程,当在entity对象上进行action操作时(操作条件是filter),将对应的todo完成
|
||||
* 必须在entity的action的后trigger中调用
|
||||
|
|
|
|||
|
|
@ -752,7 +752,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
},
|
||||
context: BRC<ED>
|
||||
): Promise<string> {
|
||||
const { account, password, env, } = params;
|
||||
const { account, password, env } = params;
|
||||
|
||||
let needUpdatePassword = false;
|
||||
const loginLogic = async () => {
|
||||
|
|
@ -830,6 +830,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
email$user: {
|
||||
$entity: 'email',
|
||||
data: {
|
||||
|
|
@ -893,7 +894,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
const allowEmail = !!applicationPassports.find((ele) => ele.passport?.type === 'email');
|
||||
const [userRow] = result;
|
||||
const { email$user, id: userId, } = userRow;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
if (allowEmail) {
|
||||
const email = email$user?.find(ele => ele.email.toLowerCase() === account.toLowerCase());
|
||||
if (email) {
|
||||
|
|
@ -945,6 +946,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
mobile$user: {
|
||||
$entity: 'mobile',
|
||||
data: {
|
||||
|
|
@ -1008,7 +1010,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
);
|
||||
const [userRow] = result;
|
||||
const { mobile$user, id: userId, } = userRow;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
const allowSms = !!applicationPassports.find((ele) => ele.passport?.type === 'sms');
|
||||
|
||||
if (allowSms) {
|
||||
|
|
@ -1062,6 +1064,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
data: {
|
||||
id: 1,
|
||||
password: 1,
|
||||
passwordSha1: 1,
|
||||
loginName$user: {
|
||||
$entity: 'loginName',
|
||||
data: {
|
||||
|
|
@ -1100,7 +1103,7 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
}
|
||||
case 1: {
|
||||
const [userRow] = result;
|
||||
needUpdatePassword = !userRow.password;
|
||||
needUpdatePassword = !(userRow.password || userRow.passwordSha1);
|
||||
const { loginName$user, id: userId, } = userRow;
|
||||
const loginName = loginName$user?.find((ele) => ele.name.toLowerCase() === account.toLowerCase());
|
||||
if (loginName) {
|
||||
|
|
@ -1160,8 +1163,9 @@ export async function loginByAccount<ED extends EntityDict>(
|
|||
await context.operate('user', {
|
||||
id: await generateNewIdAsync(),
|
||||
action: 'update',
|
||||
data: password ? {
|
||||
data: needUpdatePassword ? {
|
||||
password,
|
||||
passwordSha1: encryptPasswordSha1(password),
|
||||
verifyPasswordAt: Date.now(),
|
||||
}: {
|
||||
verifyPasswordAt: Date.now(),
|
||||
|
|
|
|||
|
|
@ -1,31 +1,6 @@
|
|||
import { encryptPasswordSha1 } from '../../utils/password';
|
||||
import dayjs from 'dayjs';
|
||||
const SEND_KEY = 'captcha:sendAt';
|
||||
const SEND_CAPTCHA_LATENCY = process.env.NODE_ENV === 'development' ? 10 : 60;
|
||||
|
||||
export default OakComponent({
|
||||
isList: false,
|
||||
// entity: 'user',
|
||||
// projection: {
|
||||
// id: 1,
|
||||
// name: 1,
|
||||
// nickname: 1,
|
||||
// mobile$user: {
|
||||
// $entity: 'mobile',
|
||||
// data: {
|
||||
// id: 1,
|
||||
// mobile: 1,
|
||||
// },
|
||||
// filter: {
|
||||
// ableState: 'enabled'
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
// formData: function ({ data: user, features, props }) {
|
||||
// return {
|
||||
// user,
|
||||
// };
|
||||
// },
|
||||
data: {
|
||||
channels: [] as string[],
|
||||
loading: false,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import { encryptPasswordSha1 } from '../../../../utils/password';
|
||||
|
||||
export default OakComponent({
|
||||
entity: 'user',
|
||||
projection: {
|
||||
|
|
@ -78,7 +80,7 @@ export default OakComponent({
|
|||
},
|
||||
async commit() {
|
||||
const { pwd } = this.state;
|
||||
this.update({ password: pwd });
|
||||
this.update({ password: pwd, passwordSha1: encryptPasswordSha1(pwd!) });
|
||||
await this.execute();
|
||||
this.setState({
|
||||
successful: true,
|
||||
|
|
|
|||
|
|
@ -234,8 +234,7 @@ export default function Render(
|
|||
setPassword2(strValue);
|
||||
if (password === strValue) {
|
||||
update({
|
||||
passwordSha1:
|
||||
encryptPasswordSha1(password),
|
||||
passwordSha1: encryptPasswordSha1(password),
|
||||
});
|
||||
}
|
||||
setPasswordConfirm(
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ import { cloneDeep, unset } from 'oak-domain/lib/utils/lodash';
|
|||
import { composeServerUrl } from '../utils/domain';
|
||||
import { maskPassword } from '../utils/user';
|
||||
import { compareVersion } from 'oak-domain/lib/utils/version';
|
||||
import { isIP } from 'oak-domain/lib/utils/validator';
|
||||
/**
|
||||
* general数据结构要求的后台上下文
|
||||
*/
|
||||
|
|
@ -478,18 +479,43 @@ export abstract class BackendRuntimeContext<ED extends EntityDict & BaseEntityDi
|
|||
throw new OakUnloggedInException('您尚未登录');
|
||||
}
|
||||
|
||||
protected sortDomains(domains: ED['domain']['Schema'][]): ED['domain']['Schema'][] {
|
||||
return domains.sort((a, b) => {
|
||||
const getPriority = (domain: EntityDict['domain']['Schema']) => {
|
||||
if (typeof domain.url !== 'string') return 3;
|
||||
const lowerItem = domain.url.toLowerCase();
|
||||
|
||||
// 1. 检查是否是localhost
|
||||
if (lowerItem === 'localhost') return 2;
|
||||
|
||||
// 2. 检查是否是IPv4或IPv6
|
||||
if (isIP(domain.url)) return 1;
|
||||
|
||||
// 3. 其他情况认为是域名
|
||||
return 0;
|
||||
};
|
||||
|
||||
return getPriority(a) - getPriority(b);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获得当前系统的访问路径,根据application/system/domain之间的关联
|
||||
* http://www.xxx.com/oak-api
|
||||
*/
|
||||
composeAccessPath(): string {
|
||||
const application = this.getApplication();
|
||||
const { system } = application!;
|
||||
const { system, domainId, domain } = application!;
|
||||
if (domainId) {
|
||||
assert(domain);
|
||||
return composeServerUrl(domain as EntityDict['domain']['Schema']);
|
||||
}
|
||||
const { domain$system: domains } = system!;
|
||||
assert(domains && domains.length === 1);
|
||||
const [ domain ] = domains;
|
||||
assert(domains && domains.length > 0);
|
||||
const findDomain = this.sortDomains(domains as EntityDict['domain']['Schema'][])?.[0];
|
||||
|
||||
return composeServerUrl(domain as EntityDict['domain']['Schema']);
|
||||
return composeServerUrl(findDomain as EntityDict['domain']['Schema']);
|
||||
}
|
||||
|
||||
async tryDeduceException(err: Error): Promise<OakException<any> | void> {
|
||||
|
|
|
|||
Loading…
Reference in New Issue