mirror of
https://github.com/woodchen-ink/Q58Connect.git
synced 2025-07-19 14:31:56 +08:00
103 lines
3.6 KiB
Markdown
103 lines
3.6 KiB
Markdown
# Discourse Connect
|
||
|
||
这是一个基于Next.js, 实现了使用 Discourse SSO (Single Sign-On) 用户系统的 OAuth 认证功能。
|
||
|
||
前端UI使用shadcn/ui.
|
||
|
||
> shadcn安装组件的命令,举例: npx shadcn@latest add button
|
||
|
||
本项目是一个中间项目, 用于允许用户通过oauth2.0认证的方式接入本项目, 但是实际用户信息是本项目通过SSO连接到Discourse论坛获取的.
|
||
|
||
原始项目地址: https://github.com/Tuluobo/discourse-connect
|
||
|
||
本项目主要是进行了:
|
||
|
||
1. 前端页面内容补充
|
||
2. 管理员的相关管理页面和统计页面
|
||
3. 本系统用户可以查看自己应用的统计信息
|
||
4. Navbar的导航菜单添加
|
||
5. 本系统用户可以限制自己应用的允许授权使用者
|
||
6. 首页说明的优化
|
||
|
||
整体流程应该是这样的:
|
||
|
||
用户登录接入应用 - 接入应用通过oauth2.0向本系统发起授权请求 - 本系统向Discourse论坛发起SSO请求 - 用户在Discourse论坛中进行登录 - Discourse论坛重定向到本系统, 并附带sso和sig参数 - 本系统通过sso和sig参数向Discourse论坛发起获取用户信息请求 - 本系统通过oauth2.0向接入应用发起回调请求, 并附带用户信息 - 接入应用通过oauth2.0向本系统发起获取用户信息请求 - 本系统通过oauth2.0向Discourse论坛发起获取用户信息请求 - 本系统返回用户信息给接入应用
|
||
|
||
## 项目概述
|
||
|
||
本项目提供了一个 OAuth 认证系统,允许其他应用程序使用 Discourse 论坛的用户账号进行身份验证。这样可以让用户使用他们已有的 Discourse 账号登录到您的应用程序,无需创建新的账号。
|
||
|
||
目前Discourse论坛是Q58论坛.
|
||
Q58论坛网址: https://q58.club
|
||
本项目部署网址: https://connect.q58.club
|
||
|
||
主要特性:
|
||
|
||
- 基于 Discourse SSO 的用户认证
|
||
- OAuth 2.0 协议支持
|
||
- 使用 Next.js 框架构建,提供良好的性能和开发体验
|
||
|
||
本项目部署在vercel, 数据库使用Neon.
|
||
|
||
## 需要检查的几点
|
||
|
||
1. 直接登录本系统
|
||
2. 未登录本系统, 未登录q58论坛, 检查: 用户在接入应用中登录, 然后登录本系统, 然后登录q58论坛, 正常一直回调到用户应用
|
||
3. 未登录本系统, 登录了q58论坛, 检查: 用户在接入应用中登录, 然后登录本系统, 正常回调到用户应用
|
||
|
||
## 用户应用接入本系统oauth2.0认证的方式:
|
||
|
||
1. 发起授权请求
|
||
将用户重定向到授权页面
|
||
|
||
const authUrl = 'https://connect.q58.club/oauth/authorize?' +
|
||
new URLSearchParams({
|
||
response_type: 'code', // 必填,固定值
|
||
client_id: 'your_client_id', // 必填,您的应用ID
|
||
redirect_uri: 'https://your-app.com/callback',
|
||
state: 'random_state', // 建议提供,防CSRF攻击
|
||
scope: 'read_profile' // 可选,默认read_profile
|
||
});
|
||
|
||
window.location.href = authUrl;
|
||
|
||
2. 处理授权回调
|
||
在回调地址处理授权结果
|
||
|
||
// 获取访问令牌
|
||
const response = await fetch('https://connect.q58.club/api/oauth/access_token', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/x-www-form-urlencoded'
|
||
},
|
||
body: new URLSearchParams({
|
||
code: '授权码', // 回调参数中的code
|
||
redirect_uri: 'https://your-app.com/callback'
|
||
})
|
||
});
|
||
|
||
const { access_token, expires_in } = await response.json();
|
||
|
||
3. 获取用户信息
|
||
使用访问令牌获取用户数据
|
||
|
||
const userInfo = await fetch('https://connect.q58.club/api/oauth/user', {
|
||
headers: {
|
||
'Authorization': `Bearer ${access_token}`
|
||
}
|
||
}).then(res => res.json());
|
||
|
||
// 返回数据示例:
|
||
{
|
||
"id": "user_xxx",
|
||
"email": "user@example.com",
|
||
"username": "username",
|
||
"name": "用户昵称",
|
||
"avatar_url": "https://...",
|
||
"groups": ["group1", "group2"]
|
||
}
|
||
|
||
## 许可证
|
||
|
||
本项目采用 MIT 许可证。详情请见 [LICENSE](LICENSE) 文件。
|