makecindy / makecindy/cindy

[Feature] 支持企业 SSO 登录时切换浏览器中的企业身份

Open
#186 1 comment 0 reactions 0 assignees View on GitHub
feature
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 问题描述

当前 Cindy 使用企业 SSO 登录时,会通过系统默认浏览器打开 SSO 授权地址。

如果用户此前已经在浏览器中登录过某个企业的 SSO,IdP 会复用已有的浏览器 Cookie,直接完成授权。此时 Cindy 不会提供重新选择企业身份或切换浏览器 SSO 会话的入口。

例如:

1. 退出 Cindy 当前账号;
2. 选择“企业 SSO 登录”;
3. 输入企业标识 `xd`;
4. 点击“以企业身份登录”;
5. 浏览器复用此前的 SSO 登录状态;
6. 直接确认登录到之前的企业身份;
7. 用户无法在 Cindy 或浏览器授权流程中选择其他企业身份。

目前用户只能通过以下方式临时规避:

- 清理浏览器 Cookie / 缓存;
- 等待原 SSO 授权过期;
- 手动退出浏览器中的企业 SSO。

这些方式会影响浏览器中的其他登录状态,使用成本较高。

## 期望行为

在企业 SSO 授权入口增加明确的身份切换能力,例如:

- 提供“切换企业身份”或“使用其他企业账号”选项;
- 支持重新发起一次强制登录;
- 支持在服务端授权链路中传递账号选择 / 强制重新认证参数;
- 如果当前企业 IdP 支持账号选择,优先跳转到 IdP 的账号选择页面;
- 如果当前 IdP 不支持自动切换,至少提供清晰的操作提示,告知用户需要退出当前 SSO 会话或使用其他浏览器配置文件。

建议不要默认清理系统浏览器 Cookie,因为这会影响用户在浏览器中使用的其他系统。

## 实际行为

Cindy 当前通过系统浏览器打开 SSO 授权链接:

```ts
shell.openExternal(authUrl)
```

客户端生成的授权地址中没有发现用于强制重新认证或选择账号的参数,例如:

```text
prompt=login
prompt=select_account
login_hint
```

因此浏览器和企业 IdP 会按照已有 Cookie 自动复用当前登录会话。

## 影响范围

- 同一用户需要在多个企业身份之间切换;
- 用户共用电脑或浏览器配置文件登录多个企业;
- 测试人员需要反复验证不同企业的 SSO 配置;
- 企业账号切换、企业环境切换场景。

## 建议实现方向

1. 先确认 Cindy auth server 是否支持向企业 IdP 透传以下参数:
- `prompt=login`
- `prompt=select_account`
- `login_hint`
- 其他企业 IdP 要求的重新认证参数。

2. 在 Cindy 的企业 SSO 登录按钮旁增加“切换身份”入口。

3. 用户选择切换身份后,使用一次性参数重新生成授权地址,并由服务端根据当前企业 IdP 能力决定:
- 强制重新认证;
- 显示账号选择;
- 清除 / 忽略当前 IdP 会话;
- 或返回明确的人工操作提示。

4. 如果不同企业使用不同的 SSO 连接,应确保重新选择企业时不会继续复用上一次企业的登录上下文。

5. 补充至少以下测试:
- 普通 SSO 登录仍复用正常浏览器会话;
- 选择“切换身份”后授权 URL 带有预期的重新认证 / 账号选择语义;
- 不同企业 SSO 连接之间不会错误复用客户端侧状态;
- 用户取消重新认证后可以回到 Cindy 并重新选择登录方式。

## 相关源码位置

- `apps/desktop/src/main/authManager.ts:426-435`:启动 loopback callback 并调用系统浏览器打开授权页。
- `packages/auth-client/src/client.ts:295-317`:构造 SSO authorize URL。
- `apps/desktop/src/renderer/components/login/LoginPage.tsx:244-343`:企业身份与个人身份登录方式选择 UI。
- `packages/auth-client/src/types.ts:151-169`:登录流程状态定义。
- `packages/auth-client/src/types.ts:237-242`:`account-selection` 仅用于登录后的 Cindy membership 选择,不是 IdP 企业身份切换。

## 验收标准

- 用户在浏览器已有企业 A SSO 会话时,可以从 Cindy 发起切换身份操作;
- 不需要手动清除浏览器全部 Cookie;
- 可以选择或重新认证企业 B 身份;
- 原有普通 SSO 登录流程不受影响;
- 取消或失败时,Cindy 能回到可重试的登录界面;
- 不泄露或持久化浏览器 Cookie、SSO token 等凭证信息。

Contributor guide

Open the contributing guide

Research direction

Read apps/desktop/src/main/authManager.ts:426-435 and packages/auth-client/src/client.ts:295-317 to trace how the loopback callback and SSO authorize URL are created. Then inspect LoginPage.tsx:244-343 and the related types in types.ts, and review existing authentication tests. Done means a separate identity-switch flow supports the stated cancellation and multi-enterprise cases without changing ordinary SSO login or exposing credentials.

Written by the indexing model from the issue text.

Assessment

Tech stack
electron, typescript
Domain
authentication, desktop
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.