fix: 修复oauth-app和provider的systemId填充问题,将oauth认证页未登录回调以及oauth结果页面的按钮回调,全部交给上层应用处理
This commit is contained in:
parent
7c35f695ab
commit
0e05a3ad4e
|
|
@ -1,3 +1,19 @@
|
|||
import { EntityDict } from '../../../../oak-app-domain';
|
||||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<EntityDict, keyof EntityDict, false, {}>) => React.ReactElement;
|
||||
import { ReactComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
|
||||
/**
|
||||
* OAuth 授权页面组件
|
||||
*/
|
||||
declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends keyof ED2>(props: ReactComponentProps<ED2, T2, true, {
|
||||
/**
|
||||
* 如果用户未登录,调用此回调函数,期望下一次重新进入该页面时,用户已经登录,并且携带相应的 OAuth 参数
|
||||
*/
|
||||
onUnLogin: (params: {
|
||||
response_type: string;
|
||||
client_id: string;
|
||||
redirect_uri: string;
|
||||
scope: string;
|
||||
state: string;
|
||||
}) => void;
|
||||
}>) => React.ReactElement;
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,14 @@
|
|||
import assert from "assert";
|
||||
/**
|
||||
* OAuth 授权页面组件
|
||||
*/
|
||||
export default OakComponent({
|
||||
// Virtual Component
|
||||
isList: false,
|
||||
filters: [],
|
||||
properties: {},
|
||||
properties: {
|
||||
onUnLogin: null,
|
||||
},
|
||||
data: {
|
||||
clientInfo: null,
|
||||
loading: true,
|
||||
|
|
@ -38,18 +43,29 @@ export default OakComponent({
|
|||
// load userinfo
|
||||
const userId = this.features.token.getUserId(true);
|
||||
if (!userId) {
|
||||
const params = new URLSearchParams();
|
||||
params.set('response_type', responseType || "");
|
||||
params.set('client_id', clientId || "");
|
||||
params.set('redirect_uri', redirectUri || "");
|
||||
params.set('scope', scope || "");
|
||||
params.set('state', state || "");
|
||||
const redirectUrl = `/login/oauth/authorize?${params.toString()}`;
|
||||
console.log('Not logged in, redirecting to login page:', redirectUrl);
|
||||
const encoded = btoa(encodeURIComponent(redirectUrl));
|
||||
this.features.navigator.navigateTo({
|
||||
url: `/login?redirect=${encoded}`,
|
||||
}, undefined, true);
|
||||
// const params = new URLSearchParams();
|
||||
// params.set('response_type', responseType || "");
|
||||
// params.set('client_id', clientId || "");
|
||||
// params.set('redirect_uri', redirectUri || "");
|
||||
// params.set('scope', scope || "");
|
||||
// params.set('state', state || "");
|
||||
// const redirectUrl = `/login/oauth/authorize?${params.toString()}`;
|
||||
// console.log('Not logged in, redirecting to login page:', redirectUrl);
|
||||
// const encoded = btoa(encodeURIComponent(redirectUrl));
|
||||
// this.features.navigator.navigateTo({
|
||||
// url: `/login?redirect=${encoded}`,
|
||||
// }, undefined, true);
|
||||
if (!this.props.onUnLogin) {
|
||||
console.error('用户未登录,请在使用Oauth授权组件时配置onUnLogin回调函数');
|
||||
return;
|
||||
}
|
||||
this.props.onUnLogin({
|
||||
response_type: responseType,
|
||||
client_id: clientId,
|
||||
redirect_uri: redirectUri,
|
||||
scope: scope,
|
||||
state: state,
|
||||
});
|
||||
return;
|
||||
}
|
||||
const userInfo = this.features.token.getUserInfo();
|
||||
|
|
|
|||
|
|
@ -1,2 +1,8 @@
|
|||
declare const _default: (props: import("oak-frontend-base").ReactComponentProps<import("../../oak-app-domain").EntityDict, keyof import("../../oak-app-domain").EntityDict, false, {}>) => React.ReactElement;
|
||||
import { EntityDict } from "../../oak-app-domain";
|
||||
import { EntityDict as BaseEntityDict } from "oak-domain/lib/base-app-domain";
|
||||
import { ReactComponentProps } from "oak-frontend-base";
|
||||
declare const _default: <ED2 extends EntityDict & BaseEntityDict, T2 extends keyof ED2>(props: ReactComponentProps<ED2, T2, true, {
|
||||
onRetry: () => void;
|
||||
onSuccess: () => void;
|
||||
}>) => React.ReactElement;
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,10 @@ export default OakComponent({
|
|||
// Virtual Component
|
||||
isList: false,
|
||||
filters: [],
|
||||
properties: {},
|
||||
properties: {
|
||||
onRetry: null,
|
||||
onSuccess: null,
|
||||
},
|
||||
data: {
|
||||
hasError: false,
|
||||
errorMessage: '',
|
||||
|
|
@ -51,14 +54,18 @@ export default OakComponent({
|
|||
this.setState({ hasError: true, errorMessage: message });
|
||||
},
|
||||
retry() {
|
||||
this.features.navigator.redirectTo({
|
||||
url: '/login',
|
||||
});
|
||||
if (!this.props.onRetry) {
|
||||
console.error('未设置失败重试回调函数,请在使用Oauth组件时配置onRetry属性');
|
||||
return;
|
||||
}
|
||||
this.props.onRetry();
|
||||
},
|
||||
returnToIndex() {
|
||||
this.features.navigator.redirectTo({
|
||||
url: '/',
|
||||
});
|
||||
if (!this.props.onSuccess) {
|
||||
console.error('未设置成功回调函数,请在使用Oauth组件时配置onSuccess属性');
|
||||
return;
|
||||
}
|
||||
this.props.onSuccess();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -50,6 +50,9 @@ export declare class Token<ED extends EntityDict> extends Feature {
|
|||
wakeupParasite(id: string): Promise<void>;
|
||||
needVerifyPassword(): boolean | null | undefined;
|
||||
verifyPassword(password: string): Promise<void>;
|
||||
/**
|
||||
* 添加一个异常到忽略列表,如果refreshToken时出现这个异常,不会强制用户登出
|
||||
*/
|
||||
addIgnoreException(clazz: typeof OakException<ED>): void;
|
||||
removeIgnoreException(clazz: typeof OakException<ED>): void;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -370,6 +370,9 @@ export class Token extends Feature {
|
|||
env,
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 添加一个异常到忽略列表,如果refreshToken时出现这个异常,不会强制用户登出
|
||||
*/
|
||||
addIgnoreException(clazz) {
|
||||
if (!this.ignoreExceptionList.includes(clazz)) {
|
||||
this.ignoreExceptionList.push(clazz);
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const _default: (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, "message", 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>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", 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, "message", 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>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -10,8 +10,7 @@ const triggers = [
|
|||
fn: async ({ operation }, context) => {
|
||||
assert(operation.data && !Array.isArray(operation.data), "oauthApplication create data 必须存在且为单条记录");
|
||||
const { data } = operation;
|
||||
const systemId = context.getSystemId();
|
||||
data.systemId = systemId;
|
||||
assert(data.systemId, "oauthApplication 创建时必须指定 systemId");
|
||||
data.clientSecret = randomUUID();
|
||||
// 默认不强制 PKCE
|
||||
data.requirePKCE = data.requirePKCE ?? false;
|
||||
|
|
|
|||
|
|
@ -8,8 +8,7 @@ const triggers = [
|
|||
fn: async ({ operation }, context) => {
|
||||
assert(operation.data && !Array.isArray(operation.data), "oauthProvider create data 必须存在且为单条记录");
|
||||
const { data } = operation;
|
||||
const systemId = context.getSystemId();
|
||||
data.systemId = systemId;
|
||||
assert(data.systemId, "oauthProvider 创建时必须指定 systemId");
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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中调用
|
||||
|
|
|
|||
|
|
@ -50,6 +50,9 @@ export declare class Token<ED extends EntityDict> extends Feature {
|
|||
wakeupParasite(id: string): Promise<void>;
|
||||
needVerifyPassword(): boolean | null | undefined;
|
||||
verifyPassword(password: string): Promise<void>;
|
||||
/**
|
||||
* 添加一个异常到忽略列表,如果refreshToken时出现这个异常,不会强制用户登出
|
||||
*/
|
||||
addIgnoreException(clazz: typeof OakException<ED>): void;
|
||||
removeIgnoreException(clazz: typeof OakException<ED>): void;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,6 +373,9 @@ class Token extends Feature_1.Feature {
|
|||
env,
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 添加一个异常到忽略列表,如果refreshToken时出现这个异常,不会强制用户登出
|
||||
*/
|
||||
addIgnoreException(clazz) {
|
||||
if (!this.ignoreExceptionList.includes(clazz)) {
|
||||
this.ignoreExceptionList.push(clazz);
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
declare const _default: (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, "message", 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>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", 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, "message", 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>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
|
||||
export default _default;
|
||||
|
|
|
|||
|
|
@ -13,8 +13,7 @@ const triggers = [
|
|||
fn: async ({ operation }, context) => {
|
||||
(0, assert_1.default)(operation.data && !Array.isArray(operation.data), "oauthApplication create data 必须存在且为单条记录");
|
||||
const { data } = operation;
|
||||
const systemId = context.getSystemId();
|
||||
data.systemId = systemId;
|
||||
(0, assert_1.default)(data.systemId, "oauthApplication 创建时必须指定 systemId");
|
||||
data.clientSecret = (0, crypto_1.randomUUID)();
|
||||
// 默认不强制 PKCE
|
||||
data.requirePKCE = data.requirePKCE ?? false;
|
||||
|
|
|
|||
|
|
@ -11,8 +11,7 @@ const triggers = [
|
|||
fn: async ({ operation }, context) => {
|
||||
(0, assert_1.default)(operation.data && !Array.isArray(operation.data), "oauthProvider create data 必须存在且为单条记录");
|
||||
const { data } = operation;
|
||||
const systemId = context.getSystemId();
|
||||
data.systemId = systemId;
|
||||
(0, assert_1.default)(data.systemId, "oauthProvider 创建时必须指定 systemId");
|
||||
return 0;
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,11 +1,23 @@
|
|||
import { EntityDict } from '../../../../oak-app-domain';
|
||||
import assert from "assert";
|
||||
import { ReactComponentProps } from 'oak-frontend-base';
|
||||
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
|
||||
|
||||
/**
|
||||
* OAuth 授权页面组件
|
||||
*/
|
||||
export default OakComponent({
|
||||
// Virtual Component
|
||||
isList: false,
|
||||
filters: [],
|
||||
properties: {
|
||||
onUnLogin: null as ((params: {
|
||||
response_type: string;
|
||||
client_id: string;
|
||||
redirect_uri: string;
|
||||
scope: string;
|
||||
state: string;
|
||||
}) => void) | null,
|
||||
},
|
||||
data: {
|
||||
clientInfo: null as EntityDict['oauthApplication']['Schema'] | null,
|
||||
|
|
@ -44,21 +56,34 @@ export default OakComponent({
|
|||
const userId = this.features.token.getUserId(true);
|
||||
|
||||
if (!userId) {
|
||||
const params = new URLSearchParams();
|
||||
params.set('response_type', responseType || "");
|
||||
params.set('client_id', clientId || "");
|
||||
params.set('redirect_uri', redirectUri || "");
|
||||
params.set('scope', scope || "");
|
||||
params.set('state', state || "");
|
||||
// const params = new URLSearchParams();
|
||||
// params.set('response_type', responseType || "");
|
||||
// params.set('client_id', clientId || "");
|
||||
// params.set('redirect_uri', redirectUri || "");
|
||||
// params.set('scope', scope || "");
|
||||
// params.set('state', state || "");
|
||||
|
||||
const redirectUrl = `/login/oauth/authorize?${params.toString()}`;
|
||||
// const redirectUrl = `/login/oauth/authorize?${params.toString()}`;
|
||||
|
||||
console.log('Not logged in, redirecting to login page:', redirectUrl);
|
||||
const encoded = btoa(encodeURIComponent(redirectUrl));
|
||||
// console.log('Not logged in, redirecting to login page:', redirectUrl);
|
||||
// const encoded = btoa(encodeURIComponent(redirectUrl));
|
||||
|
||||
this.features.navigator.navigateTo({
|
||||
url: `/login?redirect=${encoded}`,
|
||||
}, undefined, true);
|
||||
// this.features.navigator.navigateTo({
|
||||
// url: `/login?redirect=${encoded}`,
|
||||
// }, undefined, true);
|
||||
|
||||
if (!this.props.onUnLogin) {
|
||||
console.error('用户未登录,请在使用Oauth授权组件时配置onUnLogin回调函数');
|
||||
return;
|
||||
}
|
||||
|
||||
this.props.onUnLogin({
|
||||
response_type: responseType,
|
||||
client_id: clientId,
|
||||
redirect_uri: redirectUri,
|
||||
scope: scope,
|
||||
state: state,
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -166,4 +191,22 @@ export default OakComponent({
|
|||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
}) as <ED2 extends EntityDict & BaseEntityDict, T2 extends keyof ED2>(
|
||||
props: ReactComponentProps<
|
||||
ED2,
|
||||
T2,
|
||||
true,
|
||||
{
|
||||
/**
|
||||
* 如果用户未登录,调用此回调函数,期望下一次重新进入该页面时,用户已经登录,并且携带相应的 OAuth 参数
|
||||
*/
|
||||
onUnLogin: (params: {
|
||||
response_type: string;
|
||||
client_id: string;
|
||||
redirect_uri: string;
|
||||
scope: string;
|
||||
state: string;
|
||||
}) => void;
|
||||
}
|
||||
>
|
||||
) => React.ReactElement;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,16 @@
|
|||
import assert from "assert";
|
||||
import { EntityDict } from "../../oak-app-domain";
|
||||
import { EntityDict as BaseEntityDict } from "oak-domain/lib/base-app-domain";
|
||||
import { ReactComponentProps } from "oak-frontend-base";
|
||||
|
||||
export default OakComponent({
|
||||
// Virtual Component
|
||||
isList: false,
|
||||
filters: [],
|
||||
properties: {},
|
||||
properties: {
|
||||
onRetry: null as (() => void) | null,
|
||||
onSuccess: null as (() => void) | null,
|
||||
},
|
||||
data: {
|
||||
hasError: false,
|
||||
errorMessage: '',
|
||||
|
|
@ -58,14 +64,28 @@ export default OakComponent({
|
|||
this.setState({ hasError: true, errorMessage: message });
|
||||
},
|
||||
retry() {
|
||||
this.features.navigator.redirectTo({
|
||||
url: '/login',
|
||||
});
|
||||
if (!this.props.onRetry) {
|
||||
console.error('未设置失败重试回调函数,请在使用Oauth组件时配置onRetry属性');
|
||||
return;
|
||||
}
|
||||
this.props.onRetry();
|
||||
},
|
||||
returnToIndex() {
|
||||
this.features.navigator.redirectTo({
|
||||
url: '/',
|
||||
});
|
||||
if (!this.props.onSuccess) {
|
||||
console.error('未设置成功回调函数,请在使用Oauth组件时配置onSuccess属性');
|
||||
return;
|
||||
}
|
||||
this.props.onSuccess();
|
||||
}
|
||||
}
|
||||
});
|
||||
}) as <ED2 extends EntityDict & BaseEntityDict, T2 extends keyof ED2>(
|
||||
props: ReactComponentProps<
|
||||
ED2,
|
||||
T2,
|
||||
true,
|
||||
{
|
||||
onRetry: () => void;
|
||||
onSuccess: () => void;
|
||||
}
|
||||
>
|
||||
) => React.ReactElement;
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ const triggers: Trigger<EntityDict, "oauthApplication", BRC<EntityDict>>[] = [
|
|||
fn: async ({ operation }, context) => {
|
||||
assert(operation.data && !Array.isArray(operation.data), "oauthApplication create data 必须存在且为单条记录")
|
||||
const { data } = operation;
|
||||
const systemId = context.getSystemId();
|
||||
|
||||
data.systemId = systemId;
|
||||
assert(data.systemId, "oauthApplication 创建时必须指定 systemId");
|
||||
|
||||
data.clientSecret = randomUUID();
|
||||
|
||||
// 默认不强制 PKCE
|
||||
|
|
|
|||
|
|
@ -13,9 +13,7 @@ const triggers: Trigger<EntityDict, "oauthProvider", BRC<EntityDict>>[] = [
|
|||
fn: async ({ operation }, context) => {
|
||||
assert(operation.data && !Array.isArray(operation.data), "oauthProvider create data 必须存在且为单条记录")
|
||||
const { data } = operation;
|
||||
const systemId = context.getSystemId();
|
||||
|
||||
data.systemId = systemId;
|
||||
assert(data.systemId, "oauthProvider 创建时必须指定 systemId");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue