mirror of
https://github.com/woodchen-ink/Q58Connect.git
synced 2025-07-18 14:01:55 +08:00
feat: Enhance Discourse SSO authentication with dynamic return URL handling
- Update signIn action to extract and use return_sso_url from SSO parameters - Modify UserAuthorize component to dynamically retrieve SSO and signature parameters - Improve error handling and logging in authentication process - Update README to reflect current project deployment and simplify description
This commit is contained in:
parent
8a7997f5b9
commit
1083416b17
16
README.md
16
README.md
@ -1,6 +1,6 @@
|
|||||||
# Discourse Connect
|
# Discourse Connect
|
||||||
|
|
||||||
这是一个基于 [Next.js](https://nextjs.org/) 的项目,实现了使用 Discourse SSO (Single Sign-On) 用户系统的 OAuth 认证功能。
|
这是一个基于Next.js,实现了使用 Discourse SSO (Single Sign-On) 用户系统的 OAuth 认证功能。
|
||||||
|
|
||||||
## 项目概述
|
## 项目概述
|
||||||
|
|
||||||
@ -12,19 +12,7 @@
|
|||||||
- OAuth 2.0 协议支持
|
- OAuth 2.0 协议支持
|
||||||
- 使用 Next.js 框架构建,提供良好的性能和开发体验
|
- 使用 Next.js 框架构建,提供良好的性能和开发体验
|
||||||
|
|
||||||
## 开始使用
|
本项目部署在vercel, 数据库使用Neon.
|
||||||
|
|
||||||
首先,运行开发服务器:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm dev
|
|
||||||
# 或
|
|
||||||
pnpm turbo
|
|
||||||
```
|
|
||||||
|
|
||||||
在浏览器中打开 [http://localhost:3000](http://localhost:3000) 查看结果。
|
|
||||||
|
|
||||||
您可以通过修改 `app/page.tsx` 来开始编辑页面。当您编辑文件时,页面会自动更新。
|
|
||||||
|
|
||||||
## 许可证
|
## 许可证
|
||||||
|
|
||||||
|
@ -4,7 +4,16 @@ import { redirect } from "next/navigation";
|
|||||||
import { signIn as nextSignIn } from "@/auth";
|
import { signIn as nextSignIn } from "@/auth";
|
||||||
|
|
||||||
export async function signIn(data: Record<string, any>) {
|
export async function signIn(data: Record<string, any>) {
|
||||||
const { redirectTo, ...credentials } = data;
|
const { sso, sig } = data;
|
||||||
await nextSignIn("credentials", credentials);
|
await nextSignIn("credentials", { sso, sig });
|
||||||
redirect(redirectTo || "/dashboard");
|
|
||||||
|
// 从 sso 参数中获取 return_sso_url
|
||||||
|
const params = new URLSearchParams(atob(sso));
|
||||||
|
const returnUrl = params.get("return_sso_url");
|
||||||
|
|
||||||
|
if (!returnUrl) {
|
||||||
|
redirect("/dashboard");
|
||||||
|
} else {
|
||||||
|
redirect(returnUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,17 +27,32 @@ export function UserAuthorize({
|
|||||||
}
|
}
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
await signIn({ ...data, redirectTo: "/dashboard" });
|
// 从 URL 中获取 sso 和 sig 参数
|
||||||
|
const url = new URL(window.location.href);
|
||||||
|
const sso = url.searchParams.get("sso");
|
||||||
|
const sig = url.searchParams.get("sig");
|
||||||
|
|
||||||
|
console.log("准备登录,参数:", {
|
||||||
|
sso: sso?.substring(0, 20) + "...",
|
||||||
|
sig: sig?.substring(0, 20) + "...",
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!sso || !sig) {
|
||||||
|
throw new Error("缺少必要的认证参数");
|
||||||
|
}
|
||||||
|
|
||||||
|
await signIn({ sso, sig });
|
||||||
// 更新 session
|
// 更新 session
|
||||||
await update();
|
await update();
|
||||||
// 强制刷新页面状态
|
// 强制刷新页面状态
|
||||||
router.refresh();
|
router.refresh();
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.error("登录过程出错:", error);
|
||||||
setError(error);
|
setError(error);
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
}, [data, isLoading, update, router]);
|
}, [isLoading, update, router]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// 直接执行登录回调
|
// 直接执行登录回调
|
||||||
@ -57,7 +72,9 @@ export function UserAuthorize({
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<p className="text-center text-gray-500">
|
<p className="text-center text-gray-500">
|
||||||
登录异常,授权失败!请稍后重试。
|
{error instanceof Error
|
||||||
|
? error.message
|
||||||
|
: "登录异常,授权失败!请稍后重试。"}
|
||||||
</p>
|
</p>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user