概述
本文档详细说明了如何将秋名社账号认证系统接入您的应用,实现用户使用秋名社账号登录功能。接入过程分为前端授权请求和后端用户信息获取两个部分。
接入流程概览
sequenceDiagram
participant User
participant YourApp as 您的应用
participant AkinaClub as 秋名社认证系统
User->>YourApp: 点击登录按钮
YourApp->>AkinaClub: 重定向到认证页面(appid参数)
AkinaClub->>User: 显示登录/授权页面
User->>AkinaClub: 输入账号密码并授权
AkinaClub->>YourApp: 重定向到回调地址(附带code)
YourApp->>AkinaClub: 使用code请求用户信息
AkinaClub->>YourApp: 返回用户JSON数据
YourApp->>User: 登录成功,显示用户信息
前端接入指南
1. 生成认证链接
在您的应用登录页面放置秋名社登录按钮,链接格式如下:
HTML<a href="https://www.kish.top/login.html?appid=YOUR_APP_ID&msg=YOUR_APP_MSG"
class="akina-login-btn">
<img src="https://static.codemao.cn/pickduck/BkCDTvodgl.png" alt="秋名社登录">
使用秋名社账号登录
</a>
参数说明:
appid: 您在秋名社开发者平台申请的应用ID(必填)
msg: 需要客户端向后端传递的信息(选填)
2. 处理回调
用户授权后,秋名社会重定向到您的回调地址,并在URL中附加code参数:
URL格式https://your-domain.com/callback?code=AUTHORIZATION_CODE
前端处理示例代码:
JavaScript// 从URL中获取授权码
const urlParams = new URLSearchParams(window.location.search);
const authCode = urlParams.get('code');
if (authCode) {
// 将code发送给后端处理
fetch('/api/akina-auth', {
method: 'POST',
body: JSON.stringify({ code: authCode }),
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => {
// 处理登录成功逻辑
console.log('登录用户:', data.username);
// 跳转到用户主页...
});
}
注意: 授权码(code)的有效期仅为2分钟,请确保及时处理
后端接入指南
1. 接收授权码
后端需要提供回调地址对应的接口,接收GET请求中的code参数
示例路由(Node.js/Express):
Node.jsapp.get('/auth/callback', (req, res) => {
const authCode = req.query.code;
if (!authCode) {
return res.status(400).json({ error: '缺少授权码' });
}
// 下一步:使用code获取用户信息
});
2. 获取用户信息
使用收到的code请求秋名社API获取用户完整信息
API端点:
API请求GET https://www.kish.top/api/code/{code}
请求示例(Node.js):
Node.jsconst axios = require('axios');
async function getAkinaUserData(code) {
try {
const response = await axios.get(
`http://www.kish.top/api/code/${code}`
);
return response.data;
} catch (error) {
console.error('获取用户信息失败:', error.response.data);
throw new Error('认证服务不可用');
}
}
// 在回调处理中使用
app.get('/auth/callback', async (req, res) => {
const authCode = req.query.code;
try {
const userData = await getAkinaUserData(authCode);
// 在此处处理用户登录/注册逻辑
// 示例:创建会话、返回用户信息等
res.json({
status: 'success',
user: userData
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
3. 用户信息响应格式
成功请求将返回JSON格式的用户数据:
JSON响应{
"authorized_apps": [
"您的应用名称"
],
"created_at": "2023-01-15 08:30:45",
"email": "user@example.com",
"id": 123456,
"msg": "abc",
"username": "秋名山车神"
}
| 字段名 | 类型 | 说明 |
|---|---|---|
| authorized_apps | string[] | 用户已授权的应用列表 |
| created_at | string | 用户在秋名社的注册时间 |
| id | integer | 用户的秋名社唯一ID |
| msg | string | 客户端向后端传递的信息 |
| username | string | 用户在秋名社的用户名 |
错误处理
常见错误情况
无效的授权码
响应: HTTP 400
原因: code参数无效或已过期
应用未授权
响应: HTTP 403
原因: 用户未授权该应用
服务器错误
响应: HTTP 500
原因: 秋名社服务器内部错误
错误响应示例
JSON错误响应{
"error": "invalid_code",
"error_description": "授权码无效或已过期"
}
State参数使用示例
JavaScript// 生成随机state
const state = Math.random().toString(36).substring(2, 15);
// 存储到session
sessionStorage.setItem('akina_state', state);
// 添加到认证链接
const authUrl = `https://www.kish.top/auth.html?appid=APP_ID&state=${state}`;
// 回调时验证
const urlParams = new URLSearchParams(window.location.search);
const stateParam = urlParams.get('state');
const savedState = sessionStorage.getItem('akina_state');
if (stateParam !== savedState) {
// 防止CSRF攻击
console.error('State参数不匹配');
return;
}
常见问题解答
如何申请应用ID?
访问秋名社开发者平台(developer.kish.top)注册开发者账号并创建应用(正在内测中)
授权码有效期多久?
每个授权码(code)有效期为2分钟,且只能使用一次
支持哪些HTTP方法?
所有API端点均支持GET方法
是否有请求频率限制?
每个appid每分钟最多允许100次请求