fix: 修复oauth-app和provider的systemId填充问题,将oauth认证页未登录回调以及oauth结果页面的按钮回调,全部交给上层应用处理

This commit is contained in:
Pan Qiancheng 2025-12-24 12:26:47 +08:00
parent 7c35f695ab
commit 0e05a3ad4e
19 changed files with 173 additions and 59 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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();
}
}
});

View File

@ -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;
}

View File

@ -370,6 +370,9 @@ export class Token extends Feature {
env,
});
}
/**
* 添加一个异常到忽略列表如果refreshToken时出现这个异常不会强制用户登出
*/
addIgnoreException(clazz) {
if (!this.ignoreExceptionList.includes(clazz)) {
this.ignoreExceptionList.push(clazz);

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
},

View File

@ -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操作时filtertodo完成
* entity的action的后trigger中调用

View File

@ -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;
}

View File

@ -373,6 +373,9 @@ class Token extends Feature_1.Feature {
env,
});
}
/**
* 添加一个异常到忽略列表如果refreshToken时出现这个异常不会强制用户登出
*/
addIgnoreException(clazz) {
if (!this.ignoreExceptionList.includes(clazz)) {
this.ignoreExceptionList.push(clazz);

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
},

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;
}