Files
ruoyi-java/doc/WPS365授权错误排查指南.md
2026-01-15 20:48:39 +08:00

260 lines
8.9 KiB
Markdown
Raw Permalink 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.

# WPS365 授权错误排查指南
## 常见错误类型
### 1. invalid_request (40000001) - redirect_uri不匹配
```json
{
"code": 40000001,
"msg": "invalid_request",
"debug": {
"desc": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. The 'redirect_uri' parameter does not match any of the OAuth 2.0 Client's pre-registered redirect urls."
}
}
```
**错误含义**redirect_uri参数值与WPS365平台配置的回调地址不一致
### 2. invalid_scope (40000005) - scope权限无效 ⚠️
```json
{
"code": 40000005,
"msg": "invalid_scope",
"debug": {
"desc": "The requested scope is invalid, unknown, or malformed. The OAuth 2.0 Client is not allowed to request scope 'file.read,ksheet.read,user.info'."
}
}
```
**错误含义**请求的scope权限格式不正确或者应用未申请这些权限
## 错误含义总览
授权错误可能由以下原因导致:
1. **缺少必需参数** - 授权请求中缺少某个必需的参数
2. **参数值无效** - 某个参数的值格式不正确
3. **参数重复** - 某个参数在请求中出现了多次
4. **redirect_uri不匹配** - redirect_uri参数值与WPS365平台配置的回调地址不一致
5. **scope无效** - scope权限格式不正确或未申请
## 排查步骤
### 1. 查看后端日志
查看后端日志中的授权URL和参数清单例如
```
生成授权URL: https://openapi.wps.cn/oauth2/auth?client_id=xxx&redirect_uri=...
📋 授权请求参数清单:
- client_id: AK20260114NNQJKV
- redirect_uri: https://jarvis.van333.cn/wps365-callback
- response_type: code
- scope: file.read,ksheet.read,user.info
- state: xxxxx
```
### 2. 检查参数名是否正确
**问题**WPS365可能使用 `app_id` 而不是标准的 `client_id`
**解决方案**
- 如果使用 `client_id` 报错,尝试改为 `app_id`
- 查看WPS365官方文档确认正确的参数名
**当前代码使用**`client_id`标准OAuth2参数名
### 3. 检查必需参数是否齐全
授权请求必须包含以下参数:
| 参数名 | 是否必需 | 说明 | 当前值 |
|--------|---------|------|--------|
| `client_id``app_id` | ✅ 必需 | 应用ID | 从配置读取 |
| `redirect_uri` | ✅ 必需 | 回调地址 | 从配置读取 |
| `response_type` | ✅ 必需 | 固定值 `code` | `code` |
| `scope` | ✅ 必需 | 权限范围 | `file.read,ksheet.read,user.info` |
| `state` | ⚠️ 推荐 | 防CSRF攻击 | 自动生成 |
### 4. 检查redirect_uri是否匹配
这是最常见的错误原因。必须确保:
1. **协议一致**:必须是 `https://`(不能是 `http://`
2. **域名一致**:必须是 `jarvis.van333.cn`(不能有 `www` 前缀)
3. **路径一致**:必须是 `/wps365-callback`(不能有末尾斜杠)
4. **端口一致**使用默认443端口不需要写端口号
**在WPS365平台配置的回调地址必须与日志中的redirect_uri完全一致**
### 5. 检查scope权限是否已申请重要
**如果遇到 `invalid_scope` 错误,请按以下步骤排查:**
#### 5.1 检查WPS365平台后台的scope格式
1. 登录WPS365开放平台
2. 进入"开发配置" > "权限管理"
3. 查看已申请的权限列表,**注意权限的格式**
- 必须以 `kso.` 开头,如:`kso.file.read``kso.file.readwrite`
- 不是 `file.read``ksheet.read`(这些格式不存在)
- 根据官方文档https://open.wps.cn/documents/app-integration-dev/wps365/server/
#### 5.2 检查scope分隔符
**根据WPS365官方文档必须使用英文逗号分隔**(不是空格):
| 分隔符 | 示例 | 说明 |
|--------|------|------|
| **逗号(正确)** | `kso.file.readwrite,kso.doclib.readwrite` | ✅ WPS365官方要求 |
| **空格(错误)** | `kso.file.readwrite kso.doclib.readwrite` | ❌ 会导致invalid_scope |
| **逗号+空格** | `kso.file.readwrite, kso.doclib.readwrite` | ⚠️ 可能支持,但不推荐 |
**重要**WPS365官方文档明确要求使用英文逗号 `,` 分隔,不能使用空格。
#### 5.3 在配置文件中指定scope
`application.yml` 中添加 `scope` 配置,**必须使用英文逗号分隔**
```yaml
wps365:
# 根据WPS365平台后台"权限管理"中显示的实际权限名称配置
# 使用英文逗号分隔WPS365官方要求
# 权限名称必须以 kso. 开头
scope: kso.file.readwrite
```
多个权限示例:
```yaml
wps365:
# 多个权限用英文逗号分隔,不能有空格
# 权限名称必须以 kso. 开头
scope: kso.file.read,kso.file.readwrite
```
#### 5.4 确认权限已申请且名称正确
**关键步骤**
1. **登录WPS365开放平台**
- 访问https://open.wps.cn/
- 进入你的应用管理页面
2. **查看已申请的权限**
- 进入"开发配置" > "权限管理"
- 查看已申请权限的**准确名称**(注意大小写、分隔符、命名空间)
3. **对比权限名称**
- 权限名称必须与后台显示的**完全一致**
- 例如:如果后台显示的是 `kso.doclib.readwrite`,不能写成 `kso.doclib.readWrite``kso_doclib_readwrite`
4. **常见权限名称示例**(仅供参考,以平台后台实际显示为准):
- `kso.doclib.readwrite` - 文档库读写权限
- `kso.doclib.read` - 文档库读取权限
- `ksheet.read` - 在线表格读取权限(如果支持)
**重要提示**
- ⚠️ `file.read``ksheet.read``user.info` 这些权限名称可能不存在
- ✅ 必须查看WPS365平台后台实际显示的权限名称
- ✅ 权限名称必须完全匹配(包括大小写、分隔符、命名空间)
- ✅ 必须使用英文逗号分隔多个权限
### 6. 尝试修改参数名
如果确认所有参数都正确,但仍然报错,可能是参数名问题:
**测试方案1**:将 `client_id` 改为 `app_id`
修改 `WPS365OAuthServiceImpl.java` 中的代码:
```java
// 原代码
authUrl.append("?client_id=").append(appId);
// 改为
authUrl.append("?app_id=").append(appId);
```
**测试方案2**同时提供两个参数如果WPS365支持
```java
authUrl.append("?app_id=").append(appId);
authUrl.append("&client_id=").append(appId);
```
### 7. 检查URL编码
确保 `redirect_uri` 参数正确进行了URL编码
- 空格应该编码为 `%20`
- 斜杠 `/` 应该编码为 `%2F`
- 冒号 `:` 应该编码为 `%3A`
查看日志中的"编码后"值,确认编码是否正确。
### 8. 验证WPS365平台配置
登录WPS365开放平台检查
1. **应用IDAppId** 是否与配置文件中的 `app-id` 一致
2. **回调地址配置** 是否与日志中的 `redirect_uri` 完全一致
3. **权限配置** 是否已申请所需的scope权限
4. **应用状态** 是否为"已上线"或"测试中"
## 常见问题
### Q1: 参数名应该用 `client_id` 还是 `app_id`
**A**: 根据WPS365官方文档确认。标准OAuth2使用 `client_id`,但某些平台可能使用 `app_id`。如果 `client_id` 不工作,尝试 `app_id`
### Q2: 为什么redirect_uri明明配置了还是报错
**A**: 最常见的原因是:
- 平台配置的回调地址与代码中的不完全一致(多了/少了斜杠、协议不同等)
- 平台配置未保存或未生效
- 使用了错误的配置环境(开发/生产)
### Q3: scope权限在哪里申请
**A**: 在WPS365开放平台的"开发配置" > "权限管理"中申请。
### Q4: 如何确认参数是否正确?
**A**: 查看后端日志会打印完整的授权URL和参数清单。对比WPS365平台配置确保完全一致。
### Q5: 遇到 `invalid_scope` 错误怎么办? ⚠️
**A**: 这是scope格式或权限问题按以下步骤排查
1. **查看WPS365平台后台的权限格式**
- 进入"开发配置" > "权限管理"
- 查看已申请权限的**确切格式**(包括分隔符、大小写)
2. **尝试不同的scope格式**
- 空格分隔:`file.read ksheet.read user.info`(当前默认)
- 逗号分隔:`file.read,ksheet.read,user.info`
-`application.yml` 中配置 `scope` 参数进行测试
3. **确认权限已申请且已审核通过**
- 权限必须处于"已通过"或"可用"状态
- 如果权限未申请,需要先申请并等待审核
4. **查看后端日志中的scope值**
- 日志会显示实际使用的scope格式
- 对比WPS365平台显示的格式确保完全一致
## 调试建议
1. **启用DEBUG日志**:在 `application.yml` 中设置日志级别为DEBUG
2. **查看完整授权URL**复制日志中的授权URL在浏览器中访问查看具体错误
3. **对比官方文档**查看WPS365官方OAuth文档确认参数名和格式
4. **联系WPS365技术支持**:如果所有参数都正确但仍报错,可能是平台问题
## 下一步
如果按照以上步骤排查后仍然报错,请提供:
1. 后端日志中的完整授权URL和参数清单
2. WPS365平台配置的回调地址截图
3. WPS365平台的应用配置截图隐藏敏感信息