# SalesforceLoginController 方法调用说明文档
## 1. 概述
SalesforceLoginController提供了一套完整的Salesforce登录相关API,支持多种登录方式,包括用户名密码登录、JWT登录、客户端凭证登录和OAuth登录。
## 2. API基础信息
- 基础URL: `/salesforce/login`
- 请求格式: JSON (POST请求)
- 响应格式: JSON
- 统一响应格式:
```json
{
"code": 200, // 响应状态码
"msg": "Success", // 响应消息
"data": {} // 响应数据
}
```
## 3. 详细方法说明
### 3.1 登录Salesforce
**方法名称**: `login`
**HTTP请求**: `POST /salesforce/login/login`
**功能说明**: 支持多种登录方式,根据loginType动态选择
**请求参数**:
| 参数名 | 类型 | 必须 | 说明 | 示例值 |
|--------|------|------|------|--------|
| loginType | String | 是 | 登录类型,可选值:password, jwt, client_credentials, oauth | "password" |
| username | String | 否 | 用户名,password和jwt登录方式必填 | "user@example.com" |
| password | String | 否 | 密码,password登录方式必填 | "password123" |
| securityToken | String | 否 | 安全令牌,password登录方式可选 | "SECURITY_TOKEN" |
| clientId | String | 否 | 客户端ID,jwt和client_credentials登录方式必填 | "CLIENT_ID" |
| clientSecret | String | 否 | 客户端密钥,client_credentials登录方式必填 | "CLIENT_SECRET" |
| jwtToken | String | 否 | JWT令牌,jwt登录方式可选 | "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." |
| privateKeyPath | String | 否 | 私钥路径,jwt登录方式可选 | "/path/to/private.key" |
| privateKeyPassword | String | 否 | 私钥密码,jwt登录方式可选 | "KEY_PASSWORD" |
| environment | String | 否 | 环境类型,可选值:production, sandbox, custom,默认production | "production" |
| customDomain | String | 否 | 自定义域名,environment为custom时必填 | "custom.salesforce.com" |
**响应示例**:
```json
{
"code": 200,
"msg": "Login successful",
"data": {
"accessToken": "00D5f0000000001!AQwAQG...",
"instanceUrl": "https://na152.salesforce.com",
"idToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "5Aep861q6x...",
"expiresAt": "2025-12-10T12:00:00",
"success": true,
"loginType": "password",
"username": "user@example.com"
}
}
```
**调用示例**:
```javascript
// 用户名密码登录
fetch('/salesforce/login/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
loginType: 'password',
username: 'user@example.com',
password: 'password123',
environment: 'production'
})
})
.then(response => response.json())
.then(data => console.log(data));
```
### 3.2 刷新访问令牌
**方法名称**: `refreshToken`
**HTTP请求**: `POST /salesforce/login/refresh-token`
**功能说明**: 根据登录类型刷新访问令牌
**请求参数**:
| 参数名 | 类型 | 必须 | 说明 | 示例值 |
|--------|------|------|------|--------|
| refreshToken | String | 是 | 刷新令牌 | "5Aep861q6x..." |
| loginType | String | 是 | 登录类型 | "password" |
**响应示例**:
```json
{
"code": 200,
"msg": "Token refreshed successfully",
"data": {
"accessToken": "00D5f0000000001!AQwAQG...",
"instanceUrl": "https://na152.salesforce.com",
"expiresAt": "2025-12-10T12:00:00",
"success": true,
"loginType": "password"
}
}
```
**调用示例**:
```javascript
fetch('/salesforce/login/refresh-token?refreshToken=5Aep861q6x...&loginType=password', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
```
### 3.3 登出Salesforce
**方法名称**: `logout`
**HTTP请求**: `POST /salesforce/login/logout`
**功能说明**: 登出并清除登录状态
**请求参数**:
| 参数名 | 类型 | 必须 | 说明 | 示例值 |
|--------|------|------|------|--------|
| accessToken | String | 是 | 访问令牌 | "00D5f0000000001!AQwAQG..." |
| loginType | String | 是 | 登录类型 | "password" |
**响应示例**:
```json
{
"code": 200,
"msg": "Logout successful",
"data": null
}
```
**调用示例**:
```javascript
fetch('/salesforce/login/logout?accessToken=00D5f0000000001!AQwAQG...&loginType=password', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
```
### 3.4 获取当前登录状态
**方法名称**: `getLoginStatus`
**HTTP请求**: `GET /salesforce/login/status`
**功能说明**: 获取当前的登录状态信息
**请求参数**: 无
**响应示例**:
```json
{
"code": 200,
"msg": "Login status retrieved",
"data": {
"accessToken": "00D5f0000000001!AQwAQG...",
"instanceUrl": "https://na152.salesforce.com",
"loginType": "password",
"username": "user@example.com",
"success": true,
"sessionValid": true
}
}
```
**调用示例**:
```javascript
fetch('/salesforce/login/status', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
```
### 3.5 清除登录状态
**方法名称**: `clearLoginStatus`
**HTTP请求**: `POST /salesforce/login/clear-status`
**功能说明**: 清除当前的登录状态信息
**请求参数**: 无
**响应示例**:
```json
{
"code": 200,
"msg": "Login status cleared successfully",
"data": null
}
```
**调用示例**:
```javascript
fetch('/salesforce/login/clear-status', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
```
### 3.6 获取支持的登录类型
**方法名称**: `getSupportedLoginTypes`
**HTTP请求**: `GET /salesforce/login/supported-types`
**功能说明**: 获取系统支持的所有登录方式类型
**请求参数**: 无
**响应示例**:
```json
{
"code": 200,
"msg": "Supported login types retrieved",
"data": ["password", "jwt", "client_credentials", "oauth"]
}
```
**调用示例**:
```javascript
fetch('/salesforce/login/supported-types', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
```
### 3.7 验证会话有效性
**方法名称**: `validateSession`
**HTTP请求**: `GET /salesforce/login/validate-session`
**功能说明**: 验证当前会话是否有效
**请求参数**: 无
**响应示例**:
```json
{
"code": 200,
"msg": "Session is valid",
"data": {
"accessToken": "00D5f0000000001!AQwAQG...",
"instanceUrl": "https://na152.salesforce.com",
"loginType": "password",
"username": "user@example.com",
"success": true,
"sessionValid": true
}
}
```
**调用示例**:
```javascript
fetch('/salesforce/login/validate-session', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
```
## 4. 前端调用最佳实践
### 4.1 登录流程
1. 获取支持的登录类型:`GET /salesforce/login/supported-types`
2. 根据用户选择的登录方式,构建相应的登录请求
3. 调用登录接口:`POST /salesforce/login/login`
4. 保存登录结果中的accessToken和refreshToken
5. 定期调用会话验证接口:`GET /salesforce/login/validate-session`
6. 当token过期时,调用刷新token接口:`POST /salesforce/login/refresh-token`
7. 用户登出时,调用登出接口:`POST /salesforce/login/logout`
### 4.2 错误处理
- 检查响应的code字段,非200表示错误
- 处理常见错误:
- 401 Unauthorized:登录信息无效
- 403 Forbidden:权限不足
- 500 Internal Server Error:服务器内部错误
- 503 Service Unavailable:服务不可用
### 4.3 安全建议
- 敏感信息(如密码、token)不要明文存储在前端
- 使用HTTPS协议传输所有请求
- 定期更新token,避免token过期
- 登出时确保清除所有本地存储的token信息
## 5. 示例代码
### 5.1 登录示例(Vue 3)
```vue
Salesforce Login