diff --git a/README.md b/README.md index 7b5279a..c69ccf1 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Q58论坛网址: https://q58.club 2. 未登录本系统, 未登录q58论坛, 检查: 用户在接入应用中登录, 然后登录本系统, 然后登录q58论坛, 正常一直回调到用户应用 3. 未登录本系统, 登录了q58论坛, 检查: 用户在接入应用中登录, 然后登录本系统, 正常回调到用户应用 -## 用户接入本系统oauth2.0认证的方式: +## 用户应用接入本系统oauth2.0认证的方式: 1. 发起授权请求 将用户重定向到授权页面 diff --git a/src/app/api/auth/q58/route.ts b/src/app/api/auth/q58/route.ts index 07eb483..670bb33 100644 --- a/src/app/api/auth/q58/route.ts +++ b/src/app/api/auth/q58/route.ts @@ -1,4 +1,4 @@ -import { cookies } from "next/headers"; +import { cookies, headers } from "next/headers"; import Hex from "crypto-js/enc-hex"; import hmacSHA256 from "crypto-js/hmac-sha256"; import WordArray from "crypto-js/lib-typedarrays"; @@ -9,9 +9,17 @@ const hostUrl = process.env.NEXT_PUBLIC_HOST_URL as string; const discourseHost = process.env.DISCOURSE_HOST as string; const clientSecret = process.env.DISCOURSE_SECRET as string; -export async function POST(_req: Request) { +export async function POST(req: Request) { const nonce = WordArray.random(16).toString(); - const return_url = `${hostUrl}/authorize`; + const referer = headers().get("referer") || ""; + const url = new URL(referer); + const searchParams = url.searchParams.toString(); + + // 如果是从OAuth授权页面来的,保留OAuth参数 + const return_url = searchParams + ? `${hostUrl}/q58/callback?oauth=${btoa(searchParams)}` + : `${hostUrl}/authorize`; + const sso = btoa(`nonce=${nonce}&return_sso_url=${return_url}`); const sig = hmacSHA256(sso, clientSecret).toString(Hex);