【feat】 优化认证中心

This commit is contained in:
Kris 2025-12-27 18:37:22 +08:00
parent 725948e751
commit 654b342e46
2 changed files with 91 additions and 9 deletions

View File

@ -47,6 +47,7 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
**可选参数**:
- `securityToken`: Salesforce 安全令牌(如果需要)
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`
**请求示例**:
```json
@ -55,7 +56,8 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
"grantType": "password",
"username": "user@example.com",
"password": "your_password",
"securityToken": "your_security_token"
"securityToken": "your_security_token",
"loginUrl": "https://test.salesforce.com"
}
```
@ -88,13 +90,17 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
- `clientId`: OAuth 客户端 ID
- `clientSecret`: OAuth 客户端密钥
**可选参数**:
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`
**请求示例**:
```json
{
"loginType": "oauth2",
"grantType": "client_credentials",
"clientId": "your_client_id",
"clientSecret": "your_client_secret"
"clientSecret": "your_client_secret",
"loginUrl": "https://test.salesforce.com"
}
```
@ -112,6 +118,9 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
- `code`: OAuth 授权码
- `state`: OAuth state 参数(用于防止 CSRF 攻击)
**可选参数**:
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`
**请求示例**:
```json
{
@ -120,7 +129,8 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
"clientId": "your_client_id",
"clientSecret": "your_client_secret",
"code": "authorization_code_from_salesforce",
"state": "random_state_string"
"state": "random_state_string",
"loginUrl": "https://test.salesforce.com"
}
```
@ -137,6 +147,7 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
**可选参数**:
- `securityToken`: Salesforce 安全令牌(如果需要)
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`
**请求示例**:
```json
@ -144,7 +155,8 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
"loginType": "legacy_credential",
"username": "user@example.com",
"password": "your_password",
"securityToken": "your_security_token"
"securityToken": "your_security_token",
"loginUrl": "https://test.salesforce.com"
}
```
@ -185,11 +197,15 @@ OAuth 2.0 登录支持三种授权类型grant_type每种类型需要不
- `loginType`: `"session_id"`
- `sessionId`: Salesforce Session ID
**可选参数**:
- `loginUrl`: 登录系统链接地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com`
**请求示例**:
```json
{
"loginType": "session_id",
"sessionId": "00Dxx0000000001!AQoAQH..."
"sessionId": "00Dxx0000000001!AQoAQH...",
"loginUrl": "https://test.salesforce.com"
}
```
@ -348,6 +364,7 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
| state | String | 条件必填 | OAuth state 参数(`oauth2` + `authorization_code` 登录时必填) |
| orgAlias | String | 条件必填 | Salesforce CLI 组织别名(`salesforce_cli` 登录时必填) |
| sessionId | String | 条件必填 | Salesforce Session ID`session_id` 登录时必填) |
| loginUrl | String | 可选 | 登录系统链接地址,用于指定 Salesforce 登录的 API 端点地址(如:`https://login.salesforce.com` 或 `https://test.salesforce.com` |
| privateKeyPath | String | 可选 | 私有密钥路径(预留字段) |
| privateKeyPassword | String | 可选 | 私有密钥密码(预留字段) |
@ -379,6 +396,7 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
| LOGIN_TYPE_EMPTY | 登录类型不能为空 |
| MISSING_USERNAME | 用户名不能为空 |
| MISSING_PASSWORD | 密码不能为空 |
| INVALID_LOGIN_URL | 登录地址格式错误 |
| OAUTH2_UNSUPPORTED_GRANT_TYPE | 不支持的授权类型 |
| OAUTH2_CONFIG_ERROR | OAuth 配置错误 |
| OAUTH2_MISSING_CLIENT_ID | OAuth 客户端 ID 未配置 |
@ -399,6 +417,12 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
5. **会话管理**: 登出时会清理缓存和更新会话状态
6. **安全令牌**: 在生产环境中,建议使用安全令牌增强安全性
7. **环境配置**: 确保 Salesforce 环境配置正确(生产环境、沙盒环境或自定义环境)
8. **自定义登录地址**: `loginUrl` 参数为可选参数,用于指定 Salesforce 登录的 API 端点地址
- 支持的登录地址示例:`https://login.salesforce.com`(生产环境)、`https://test.salesforce.com`(沙盒环境)
- 如果不提供 `loginUrl`,系统将使用默认配置的登录地址
- `loginUrl` 参数支持 `oauth2`、`legacy_credential` 和 `session_id` 登录类型
- `salesforce_cli` 登录类型不支持 `loginUrl` 参数,因为 CLI 工具内部管理登录状态
- 系统会自动验证 `loginUrl` 的格式,如果格式错误将返回错误信息
---
@ -468,6 +492,7 @@ curl -X POST http://localhost:8080/salesforce/login/autoLogin
|------|------|------|
| 1.0 | 2025-12-14 | 初始版本 |
| 1.1 | 2025-12-25 | 优化 logout、getCurrentLoginInfo、autoLogin 方法,无需传参 |
| 1.2 | 2025-12-26 | 新增 loginUrl 参数,支持自定义 Salesforce 登录地址 |
---

View File

@ -28,6 +28,33 @@
</el-select>
</el-form-item>
<el-form-item v-if="showLoginUrl" label="登录地址 (Login URL)" prop="loginUrl">
<el-input
v-model="loginForm.loginUrl"
prefix-icon="Link"
placeholder="https://login.salesforce.com"
clearable
:readonly="!isCustomLoginUrl"
>
<template #append>
<el-dropdown @command="handleLoginUrlPreset">
<el-button>
<el-icon><ArrowDown /></el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="https://login.salesforce.com">生产环境</el-dropdown-item>
<el-dropdown-item command="https://test.salesforce.com">沙盒环境</el-dropdown-item>
<el-dropdown-item command="custom" divided>自定义</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-input>
<div class="form-tip">留空则使用系统默认配置</div>
</el-form-item>
<el-form-item v-if="showUsername" label="用户名" prop="username">
<el-input v-model="loginForm.username" prefix-icon="User" placeholder="name@company.com" clearable />
</el-form-item>
@ -64,6 +91,7 @@
<el-input v-model="loginForm.sessionId" type="textarea" :rows="3" placeholder="Paste Session ID here" clearable />
</el-form-item>
<el-button type="primary" :loading="loginLoading" @click="handleLogin" class="main-login-btn">
<el-icon class="el-icon--left"><Switch /></el-icon>
发起登录请求
@ -79,14 +107,14 @@
</el-button>
</el-tooltip>
<el-tooltip content="刷新查看当前Token状态" placement="bottom">
<el-tooltip content="刷新查看当前登录信息" placement="bottom">
<el-button type="info" plain :loading="currentLoading" @click="handleGetCurrentInfo" class="flex-btn">
<el-icon class="el-icon--left"><User /></el-icon>
刷新信息
</el-button>
</el-tooltip>
<el-tooltip content="销毁当前Session" placement="bottom">
<el-tooltip content="销毁当前登录信息" placement="bottom">
<el-button type="warning" plain :loading="logoutLoading" @click="handleLogout" class="flex-btn">
<el-icon class="el-icon--left"><SwitchButton /></el-icon>
登出
@ -194,7 +222,7 @@
import { ElMessage, ElMessageBox } from 'element-plus';
import {
RefreshRight, User, SwitchButton, DocumentCopy, Switch,
Connection, Key, Lock, Ticket, Hide, Monitor, TopRight
Connection, Key, Lock, Ticket, Hide, Monitor, TopRight, ArrowDown, Link
} from '@element-plus/icons-vue';
const { proxy } = getCurrentInstance();
@ -205,6 +233,8 @@
const currentLoading = ref(false);
const logoutLoading = ref(false);
const loginResult = ref(null);
// false (/)
const isCustomLoginUrl = ref(false);
const loginForm = ref({
loginType: 'oauth2',
@ -217,7 +247,8 @@
code: '',
state: '',
orgAlias: '',
sessionId: ''
sessionId: '',
loginUrl: ''
});
// --- Computed ---
@ -262,6 +293,23 @@
return loginForm.value.loginType === 'session_id';
});
const showLoginUrl = computed(() => {
return ['oauth2', 'legacy_credential', 'session_id'].includes(loginForm.value.loginType);
});
//
const handleLoginUrlPreset = (command) => {
if (command === 'custom') {
//
isCustomLoginUrl.value = true; //
loginForm.loginUrl = ''; // 便
} else {
//
isCustomLoginUrl.value = false; //
loginForm.loginUrl = command; // URL
}
};
// --- ---
const rules = computed(() => {
const baseRules = {
@ -310,6 +358,7 @@
resetFormFields();
};
const resetFormFields = () => {
loginForm.value.username = '';
loginForm.value.password = '';
@ -320,6 +369,7 @@
loginForm.value.state = '';
loginForm.value.orgAlias = '';
loginForm.value.sessionId = '';
loginForm.value.loginUrl = '';
};
const handleLogin = async () => {
@ -564,6 +614,13 @@
margin-top: 10px;
}
.form-tip {
font-size: 12px;
color: #909399;
margin-top: 4px;
line-height: 1.4;
}
/* 响应式调整 */
@media screen and (max-width: 768px) {
.main-row {