datai-vue/doc/salesforce/SalesforceLoginControllerAPI.md

506 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | 否 | 客户端IDjwt和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
<template>
<div>
<h1>Salesforce Login</h1>
<div>
<label for="loginType">Login Type:</label>
<select v-model="loginType">
<option value="password">Password</option>
<option value="jwt">JWT</option>
<option value="client_credentials">Client Credentials</option>
</select>
</div>
<div v-if="loginType === 'password'">
<div>
<label for="username">Username:</label>
<input type="text" v-model="username" />
</div>
<div>
<label for="password">Password:</label>
<input type="password" v-model="password" />
</div>
</div>
<button @click="login">Login</button>
<div v-if="error" class="error">{{ error }}</div>
<div v-if="success" class="success">{{ success }}</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const loginType = ref('password');
const username = ref('');
const password = ref('');
const error = ref('');
const success = ref('');
const login = async () => {
try {
const response = await fetch('/salesforce/login/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
loginType: loginType.value,
username: username.value,
password: password.value
})
});
const data = await response.json();
if (data.code === 200) {
success.value = 'Login successful';
error.value = '';
// 保存token等信息
localStorage.setItem('salesforceAccessToken', data.data.accessToken);
localStorage.setItem('salesforceRefreshToken', data.data.refreshToken);
} else {
error.value = data.msg;
success.value = '';
}
} catch (err) {
error.value = 'Login failed: ' + err.message;
success.value = '';
}
};
</script>
```
### 5.2 会话验证示例React
```javascript
import React, { useEffect, useState } from 'react';
const SessionValidator = () => {
const [sessionValid, setSessionValid] = useState(false);
const [loading, setLoading] = useState(true);
useEffect(() => {
const validateSession = async () => {
try {
const response = await fetch('/salesforce/login/validate-session', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();
setSessionValid(data.code === 200 && data.data.sessionValid);
} catch (err) {
setSessionValid(false);
} finally {
setLoading(false);
}
};
validateSession();
// 每5分钟验证一次会话
const interval = setInterval(validateSession, 5 * 60 * 1000);
return () => clearInterval(interval);
}, []);
if (loading) {
return <div>Checking session...</div>;
}
return (
<div>
<h2>Session Status: {sessionValid ? 'Valid' : 'Invalid'}</h2>
{!sessionValid && (
<button onClick={() => window.location.href = '/login'}>
Login Again
</button>
)}
</div>
);
};
export default SessionValidator;
```
## 6. 常见问题
### 6.1 如何选择合适的登录方式?
- **password登录**:适用于开发测试环境,需要用户名和密码
- **jwt登录**:适用于机器到机器的集成,安全性较高
- **client_credentials登录**:适用于服务器到服务器的集成
- **oauth登录**:适用于第三方应用集成,支持授权码流程
### 6.2 token过期怎么办
当token过期时系统会自动检测并返回sessionValid: false此时需要
1. 调用`POST /salesforce/login/refresh-token`接口刷新token
2. 如果刷新失败,需要重新登录
### 6.3 如何获取当前登录用户信息?
调用`GET /salesforce/login/status`接口响应中包含username和其他用户信息
### 6.4 如何处理不同环境?
通过environment参数指定环境类型
- production生产环境
- sandbox沙盒环境
- custom自定义环境需要同时提供customDomain参数
## 7. 版本说明
- 当前版本1.0.0
- 支持的Salesforce API版本61.0.0
## 8. 联系方式
如有问题,请联系系统管理员或开发团队。