[codex] add Rodak desktop browser auth - #21
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
该 PR 在 mortise-member 增加 Rodak 桌面端浏览器授权桥(授权码 + PKCE、refresh、logout),并引入“会员客户端会话”数据模型与安全中心接口;同时更新前端(site + standalone 模板)增加授权确认页与账号安全中心页面,并在 core-sdk 中补齐调用与类型。
Changes:
- 新增桌面端 OAuth 授权桥服务与接口:授权码缓存、PKCE 校验、token 兑换/刷新、logout/撤销会话。
- 新增会员客户端会话表(Flyway V440)及对应的 Mapper/实体/Service,实现会话创建、活跃更新时间、撤销。
- 前端新增
/auth/desktop/authorize授权确认页与/security安全中心页;core-sdk 增加相应 API 方法与类型,并在站点/模板导航加入入口。
Reviewed changes
Copilot reviewed 35 out of 36 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| mortise-member/mortise-member-infra/src/main/resources/db/migration/V440__Create_Member_Client_Session_Table.sql | 新增会员客户端会话表、索引与 updated_time 触发器 |
| mortise-member/mortise-member-infra/src/main/java/com/rymcu/mortise/member/mapper/MemberClientSessionMapper.java | 新增会话表 Mapper |
| mortise-member/mortise-member-domain/src/main/java/com/rymcu/mortise/member/entity/MemberClientSession.java | 新增会话实体与逻辑删除标记 |
| mortise-member/mortise-member-domain/src/main/java/com/rymcu/mortise/member/constant/MemberJwtConstants.java | JWT claim 增加 sid/clientId/loginChannel/scope 等常量 |
| mortise-member/mortise-member-domain/src/main/java/com/rymcu/mortise/member/constant/DesktopOAuthConstants.java | 桌面端授权桥常量(clientId、grant_type、cache key 等) |
| mortise-member/mortise-member-application/src/main/java/com/rymcu/mortise/member/service/MemberClientSessionService.java | 会话 Service 接口(创建/触达/列表/撤销) |
| mortise-member/mortise-member-application/src/main/java/com/rymcu/mortise/member/service/impl/MemberClientSessionServiceImpl.java | 会话 Service 实现(落库、活跃时间更新、撤销) |
| mortise-member/mortise-member-api/src/test/java/com/rymcu/mortise/member/api/service/impl/DesktopOAuthServiceImplTest.java | 桌面端授权桥核心场景单测(一次性 code、过期、PKCE、刷新/撤销) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/service/impl/DesktopOAuthServiceImpl.java | 授权码创建、PKCE 校验、token 兑换/刷新、logout/撤销逻辑 |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/service/DesktopOAuthService.java | 桌面端授权桥 Service API |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/model/MemberClientSessionResponse.java | 会话列表响应 DTO(record) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/model/DesktopTokenResponse.java | 桌面端 token 响应 DTO(record) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/model/DesktopTokenRequest.java | 桌面端 token 请求 DTO(record) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/model/DesktopLogoutRequest.java | 桌面端 logout 请求 DTO(record) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/model/DesktopAuthorizeResponse.java | 授权确认返回回调地址 DTO(record) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/model/DesktopAuthorizationCodePayload.java | 授权码缓存载荷 DTO(record) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/controller/MemberSecurityController.java | 安全中心:会话列表与撤销接口 |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/controller/DesktopOAuthController.java | 桌面端授权桥 Controller(authorize/token/logout) |
| mortise-member/mortise-member-api/src/main/java/com/rymcu/mortise/member/api/config/AppSecurityConfigurer.java | 放行桌面端 token/logout 为公开接口 |
| frontend/templates/standalone/package.json | standalone 模板补齐 Nuxt 相关依赖 |
| frontend/templates/standalone/nuxt.config.ts | standalone 模板配置 desktopAuthorizePath |
| frontend/templates/standalone/app/types/security.ts | standalone 安全中心类型定义 |
| frontend/templates/standalone/app/pages/security.vue | standalone 安全中心页面(会话列表/撤销) |
| frontend/templates/standalone/app/pages/auth/login.vue | standalone 登录页移除 returnToChat 逻辑 |
| frontend/templates/standalone/app/pages/auth/desktop/authorize.vue | standalone 授权确认页(调用 authorizeDesktopClient) |
| frontend/templates/standalone/app/composables/useMemberSecurity.ts | standalone 安全中心 composable(拉取/撤销会话) |
| frontend/templates/standalone/app/components/AppHeader.vue | standalone 用户菜单增加“账号安全”入口 |
| frontend/pnpm-lock.yaml | 锁文件更新(新增 Nuxt 依赖) |
| frontend/packages/core-sdk/src/types.ts | core-sdk 新增桌面端授权/会话相关类型 |
| frontend/packages/core-sdk/src/member.ts | core-sdk 新增授权/会话 API(authorizeDesktopClient、fetch/revoke sessions) |
| frontend/apps/site/package.json | site app 补齐 Nuxt 相关依赖 |
| frontend/apps/site/app/types/security.ts | site 安全中心类型定义 |
| frontend/apps/site/app/pages/security.vue | site 安全中心页面(会话列表/撤销) |
| frontend/apps/site/app/pages/auth/desktop/authorize.vue | site 授权确认页(调用 authorizeDesktopClient) |
| frontend/apps/site/app/composables/useMemberSecurity.ts | site 安全中心 composable(拉取/撤销会话) |
| frontend/apps/site/app/components/AppHeader.vue | site 用户菜单增加“账号安全”入口 |
Files not reviewed (1)
- frontend/pnpm-lock.yaml: Language not supported
Comment on lines
+234
to
+236
| Member member = getActiveMember(memberId); | ||
| return buildTokenResponse(member, session, DesktopOAuthConstants.DEFAULT_SCOPE, request.refreshToken()); | ||
| } |
Comment on lines
+79
to
+83
| session.getLastActiveAt(), | ||
| session.getRevokedAt(), | ||
| session.getCreatedTime(), | ||
| false | ||
| ); |
Comment on lines
+42
to
+52
| function formatTime(value?: string | null): string { | ||
| if (!value) { | ||
| return '暂无记录' | ||
| } | ||
| return new Intl.DateTimeFormat('zh-CN', { | ||
| year: 'numeric', | ||
| month: '2-digit', | ||
| day: '2-digit', | ||
| hour: '2-digit', | ||
| minute: '2-digit' | ||
| }).format(new Date(value)) |
Comment on lines
+30
to
+40
| function formatTime(value?: string | null): string { | ||
| if (!value) { | ||
| return '暂无记录' | ||
| } | ||
| return new Intl.DateTimeFormat('zh-CN', { | ||
| year: 'numeric', | ||
| month: '2-digit', | ||
| day: '2-digit', | ||
| hour: '2-digit', | ||
| minute: '2-digit' | ||
| }).format(new Date(value)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更说明
/auth/desktop/authorize授权确认页,并在用户菜单加入账号安全入口。关联规范
自检清单
验证
mvn -pl mortise-member/mortise-member-api -am test -Dtest=DesktopOAuthServiceImplTest '-Dsurefire.failIfNoSpecifiedTests=false'pnpm --filter @mortise/site typecheckmvn -pl mortise-app -am clean package -DskipTestshttps://rymcu.com/topics、/collections、/auth/desktop/authorize、/security。回滚
/opt/mortise/mortise.jar.bak-20260510200256.output备份:/opt/mortise/frontend/site/.output.bak-20260510200349/opt/mortise/backups/db/mortise-pre-rodak-auth-20260510195611.sql.gz