Files
d1kt/api-documentation.md

501 lines
15 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.
# D1KT平台API接口调用文档
## 目录
- [简介](#简介)
- [基础信息](#基础信息)
- [登录API](#登录api)
- [注册API](#注册api)
- [代码调用示例](#代码调用示例)
- [错误处理](#错误处理)
- [安全建议](#安全建议)
## 简介
本文档提供了D1KT平台用户认证系统API的详细调用说明帮助开发者在第三方应用中集成D1KT的用户登录和注册功能。
## 基础信息
- **基础URL**: `https://d1kt.cn/api/api`
- **API版本**: v1
- **内容类型**: application/json
- **字符编码**: UTF-8
- **认证方式**: JWT (JSON Web Token)
## 登录API
### 接口描述
此接口用于验证用户身份并获取访问令牌。
### 请求详情
- **URL**: `/auth/login`
- **方法**: POST
- **内容类型**: application/json
### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 验证规则 |
|--------|------|------|------|---------|
| username | String | 是 | 用户名 | 长度2-20个字符 |
| password | String | 是 | 密码 | 长度至少6个字符 |
### 请求示例
```json
{
"username": "testuser",
"password": "password123"
}
```
### 响应参数
| 参数名 | 类型 | 描述 |
|--------|------|------|
| token | String | JWT令牌用于后续请求的认证 |
| user | Object | 用户信息对象 |
| user._id | String | 用户唯一标识符 |
| user.username | String | 用户名 |
| user.fullname | String | 用户姓名 |
| user.email | String | 用户邮箱 |
| user.isAdmin | Boolean | 是否为管理员 |
### 成功响应示例
```json
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"_id": "60d21b4667d0d8992e610c85",
"username": "testuser",
"fullname": "测试用户",
"email": "test@example.com",
"isAdmin": false
}
}
```
### 可能的错误
| HTTP状态码 | 错误消息 | 描述 |
|------------|----------|------|
| 400 | 请填写所有字段 | 用户名或密码为空 |
| 400 | 用户名长度应在2-20个字符之间 | 用户名长度不符合要求 |
| 400 | 密码长度至少6个字符 | 密码长度不符合要求 |
| 401 | 用户不存在 | 提供的用户名不存在 |
| 401 | 密码错误 | 提供的密码与用户名不匹配 |
| 500 | 服务器内部错误 | 服务器处理请求时出错 |
## 注册API
### 接口描述
此接口用于创建新用户账户并获取访问令牌。
### 请求详情
- **URL**: `/auth/register`
- **方法**: POST
- **内容类型**: application/json
### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 验证规则 |
|--------|------|------|------|---------|
| username | String | 是 | 用户名 | 长度2-20个字符 |
| email | String | 是 | 电子邮箱 | 有效的邮箱格式 |
| fullname | String | 是 | 姓名 | 长度2-50个字符 |
| password | String | 是 | 密码 | 长度至少6个字符 |
### 请求示例
```json
{
"username": "newuser",
"email": "newuser@example.com",
"fullname": "新用户",
"password": "password123"
}
```
### 响应参数
| 参数名 | 类型 | 描述 |
|--------|------|------|
| token | String | JWT令牌用于后续请求的认证 |
| user | Object | 用户信息对象 |
| user._id | String | 用户唯一标识符 |
| user.username | String | 用户名 |
| user.fullname | String | 用户姓名 |
| user.isAdmin | Boolean | 是否为管理员 |
### 成功响应示例
```json
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"_id": "60d21b4667d0d8992e610c85",
"username": "newuser",
"fullname": "新用户",
"isAdmin": false
}
}
```
### 可能的错误
| HTTP状态码 | 错误消息 | 描述 |
|------------|----------|------|
| 400 | 请填写必填字段 | 有必填字段为空 |
| 400 | 用户名长度应在2-20个字符之间 | 用户名长度不符合要求 |
| 400 | 密码长度至少6个字符 | 密码长度不符合要求 |
| 400 | 请输入有效的邮箱地址 | 邮箱格式不正确 |
| 400 | 姓名长度应在2-50个字符之间 | 姓名长度不符合要求 |
| 409 | 用户名已存在 | 提供的用户名已被注册 |
| 409 | 邮箱已被使用 | 提供的邮箱已被注册 |
| 500 | 服务器内部错误 | 服务器处理请求时出错 |
## 代码调用示例
### JavaScript (Fetch API)
```javascript
// 登录API调用示例
async function login(username, password) {
try {
const response = await fetch('https://d1kt.cn/api/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username, password })
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || '登录失败');
}
const data = await response.json();
// 保存token和用户信息
localStorage.setItem('token', data.token);
localStorage.setItem('user', JSON.stringify(data.user));
return data;
} catch (error) {
console.error('登录失败:', error);
throw error;
}
}
// 注册API调用示例
async function register(username, email, fullname, password) {
try {
const response = await fetch('https://d1kt.cn/api/api/auth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username, email, fullname, password })
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || '注册失败');
}
const data = await response.json();
// 保存token和用户信息
localStorage.setItem('token', data.token);
localStorage.setItem('user', JSON.stringify(data.user));
return data;
} catch (error) {
console.error('注册失败:', error);
throw error;
}
}
// 带身份验证的API调用示例
async function callAuthenticatedAPI(endpoint) {
const token = localStorage.getItem('token');
if (!token) {
throw new Error('未登录,请先登录');
}
try {
const response = await fetch(`https://d1kt.cn/api/api${endpoint}`, {
method: 'GET', // 或其他方法
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
if (!response.ok) {
// 如果token过期或无效
if (response.status === 401) {
localStorage.removeItem('token');
localStorage.removeItem('user');
throw new Error('会话已过期,请重新登录');
}
const errorData = await response.json();
throw new Error(errorData.message || '请求失败');
}
return await response.json();
} catch (error) {
console.error('API调用失败:', error);
throw error;
}
}
```
### Python (Requests)
```python
import requests
import json
# API基础URL
BASE_URL = "https://d1kt.cn/api/api"
# 登录API调用示例
def login(username, password):
url = f"{BASE_URL}/auth/login"
headers = {"Content-Type": "application/json"}
payload = {"username": username, "password": password}
try:
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status() # 如果请求失败,抛出异常
data = response.json()
# 在实际应用中您可能需要保存token和用户信息
return data
except requests.exceptions.HTTPError as e:
error_msg = "未知错误"
try:
error_data = response.json()
error_msg = error_data.get("message", "登录失败")
except:
pass
print(f"登录失败: {error_msg}")
raise Exception(error_msg)
except Exception as e:
print(f"请求异常: {str(e)}")
raise
# 注册API调用示例
def register(username, email, fullname, password):
url = f"{BASE_URL}/auth/register"
headers = {"Content-Type": "application/json"}
payload = {
"username": username,
"email": email,
"fullname": fullname,
"password": password
}
try:
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status() # 如果请求失败,抛出异常
data = response.json()
# 在实际应用中您可能需要保存token和用户信息
return data
except requests.exceptions.HTTPError as e:
error_msg = "未知错误"
try:
error_data = response.json()
error_msg = error_data.get("message", "注册失败")
except:
pass
print(f"注册失败: {error_msg}")
raise Exception(error_msg)
except Exception as e:
print(f"请求异常: {str(e)}")
raise
# 带身份验证的API调用示例
def call_authenticated_api(endpoint, token):
url = f"{BASE_URL}{endpoint}"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
try:
response = requests.get(url, headers=headers) # 或其他方法
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
if response.status_code == 401:
raise Exception("会话已过期,请重新登录")
error_msg = "未知错误"
try:
error_data = response.json()
error_msg = error_data.get("message", "请求失败")
except:
pass
print(f"API调用失败: {error_msg}")
raise Exception(error_msg)
except Exception as e:
print(f"请求异常: {str(e)}")
raise
```
### Java (OkHttp)
```java
import com.squareup.okhttp.*;
import org.json.JSONObject;
import java.io.IOException;
public class D1ktApiClient {
private static final String BASE_URL = "https://d1kt.cn/api/api";
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private final OkHttpClient client = new OkHttpClient();
// 登录API调用示例
public JSONObject login(String username, String password) throws Exception {
JSONObject requestBody = new JSONObject();
requestBody.put("username", username);
requestBody.put("password", password);
Request request = new Request.Builder()
.url(BASE_URL + "/auth/login")
.post(RequestBody.create(JSON, requestBody.toString()))
.build();
try (Response response = client.newCall(request).execute()) {
String responseBody = response.body().string();
if (!response.isSuccessful()) {
JSONObject errorJson = new JSONObject(responseBody);
String errorMessage = errorJson.optString("message", "登录失败");
throw new Exception(errorMessage);
}
return new JSONObject(responseBody);
} catch (IOException e) {
throw new Exception("网络请求异常: " + e.getMessage());
}
}
// 注册API调用示例
public JSONObject register(String username, String email, String fullname, String password) throws Exception {
JSONObject requestBody = new JSONObject();
requestBody.put("username", username);
requestBody.put("email", email);
requestBody.put("fullname", fullname);
requestBody.put("password", password);
Request request = new Request.Builder()
.url(BASE_URL + "/auth/register")
.post(RequestBody.create(JSON, requestBody.toString()))
.build();
try (Response response = client.newCall(request).execute()) {
String responseBody = response.body().string();
if (!response.isSuccessful()) {
JSONObject errorJson = new JSONObject(responseBody);
String errorMessage = errorJson.optString("message", "注册失败");
throw new Exception(errorMessage);
}
return new JSONObject(responseBody);
} catch (IOException e) {
throw new Exception("网络请求异常: " + e.getMessage());
}
}
// 带身份验证的API调用示例
public JSONObject callAuthenticatedAPI(String endpoint, String token) throws Exception {
Request request = new Request.Builder()
.url(BASE_URL + endpoint)
.header("Authorization", "Bearer " + token)
.build();
try (Response response = client.newCall(request).execute()) {
String responseBody = response.body().string();
if (!response.isSuccessful()) {
if (response.code() == 401) {
throw new Exception("会话已过期,请重新登录");
}
JSONObject errorJson = new JSONObject(responseBody);
String errorMessage = errorJson.optString("message", "请求失败");
throw new Exception(errorMessage);
}
return new JSONObject(responseBody);
} catch (IOException e) {
throw new Exception("网络请求异常: " + e.getMessage());
}
}
}
```
## 错误处理
所有API错误响应都会返回HTTP错误状态码和JSON格式的错误信息
```json
{
"message": "错误描述信息"
}
```
### 常见HTTP状态码
| 状态码 | 描述 |
|--------|------|
| 200 | 请求成功 |
| 400 | 无效请求(如参数错误、格式错误等) |
| 401 | 认证失败(如令牌无效或过期) |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 409 | 资源冲突(如用户名已存在) |
| 500 | 服务器内部错误 |
### 错误处理最佳实践
1. 始终捕获并处理API调用中可能发生的异常
2. 为用户提供有意义的错误消息
3. 在认证失败时,引导用户重新登录
4. 实现适当的重试机制,处理临时性网络问题
## 安全建议
1. **HTTPS通信**: 所有API请求都必须使用HTTPS协议确保数据传输安全
2. **安全存储令牌**: 在客户端安全存储用户令牌避免XSS攻击
3. **令牌过期处理**: 当令牌过期时,引导用户重新登录
4. **敏感信息处理**: 敏感信息不应明文存储在客户端
5. **防CSRF**: 实现适当的CSRF防护机制
6. **限制登录尝试**: 实现账户锁定机制,防止暴力破解
## 集成流程
1. **实现登录/注册界面**: 创建符合您应用风格的登录和注册表单
2. **表单验证**: 在客户端进行基本的表单验证确保数据符合API要求
3. **调用API**: 使用上述代码示例实现API调用
4. **处理响应**: 根据API响应更新UI和应用状态
5. **令牌管理**: 实现令牌的存储、使用和更新机制
6. **用户会话**: 维护用户会话状态,处理登录/登出逻辑
## 联系与支持
如有任何问题或需要进一步的支持请联系D1KT技术支持团队。
---
© 2023 D1KT平台 - 保留所有权利