This commit is contained in:
root
2026-06-07 12:48:17 +08:00
parent 9ee203c221
commit 283d65d1d1
46 changed files with 1205 additions and 2579 deletions

View File

@@ -1,44 +0,0 @@
import { getPocketBaseConfig } from "@/config/services.config";
let cachedToken: { token: string; expiresAt: number } | null = null;
const TOKEN_TTL_MS = 10 * 60 * 1000;
/**
* PocketBase v0.23+ 使用 _superusers 集合替代旧 /api/admins 端点。
* 此函数依次尝试新旧两个端点,兼容所有版本。
*/
export async function getAdminToken(): Promise<string | null> {
if (cachedToken && Date.now() < cachedToken.expiresAt) {
return cachedToken.token;
}
const email = process.env.POCKETBASE_EMAIL;
const password = process.env.POCKETBASE_PASSWORD;
if (!email || !password) return null;
const pb = getPocketBaseConfig();
const base = pb.url.replace(/\/$/, "");
const body = JSON.stringify({ identity: email, password });
const headers = { "Content-Type": "application/json" };
const endpoints = [
`${base}/api/collections/_superusers/auth-with-password`,
`${base}/api/admins/auth-with-password`,
];
for (const url of endpoints) {
try {
const res = await fetch(url, { method: "POST", headers, body });
if (!res.ok) continue;
const data = await res.json();
const token = data?.token;
if (token) {
cachedToken = { token, expiresAt: Date.now() + TOKEN_TTL_MS };
return token;
}
} catch {
continue;
}
}
return null;
}

View File

@@ -1,8 +1,7 @@
/**
* PocketBase 认证服务 - 邮箱登录、注册
* 认证服务 - 前端只调用 FastAPI,不直连 PocketBase。
*/
import { getPocketBaseConfig } from "@/config/services.config";
import { PB_STORAGE_KEYS } from "./constants";
import { apiUrl } from "@/app/lib/api-client";
@@ -15,48 +14,37 @@ export interface AuthUser {
export interface AuthResult {
token: string;
record: AuthUser;
is_new?: boolean;
provider?: string;
}
function getPBUrl(): string {
return getPocketBaseConfig().url;
}
export async function pbLogin(
identity: string,
password: string
): Promise<AuthResult> {
const res = await fetch(apiUrl("/api/auth/login"), {
async function authRequest(path: string, body: Record<string, unknown>): Promise<AuthResult> {
const res = await fetch(apiUrl(path), {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "include",
body: JSON.stringify({ email: identity, password }),
body: JSON.stringify(body),
});
if (!res.ok) {
const err = await res.json();
throw new Error(err?.detail || err?.message || "登录失败");
throw new Error(err?.detail || err?.message || "认证失败");
}
const data = await res.json();
if (!data?.token) throw new Error("登录响应异常");
return { token: data.token, record: data.record };
return {
token: data.token,
record: data.record,
is_new: data.is_new,
provider: data.provider,
};
}
export async function pbRegister(
email: string,
password: string,
passwordConfirm: string
): Promise<AuthResult> {
const res = await fetch(apiUrl("/api/auth/register"), {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "include",
body: JSON.stringify({ email, password, passwordConfirm }),
});
if (!res.ok) {
const err = await res.json();
throw new Error(err?.detail || err?.message || "注册失败");
}
const data = await res.json();
return { token: data.token, record: data.record };
export async function emailLogin(email: string): Promise<AuthResult> {
return authRequest("/api/auth/email", { email });
}
export async function googleLogin(idToken: string): Promise<AuthResult> {
return authRequest("/api/auth/google", { id_token: idToken });
}
export function pbSaveAuth(token: string, record: AuthUser): void {

View File

@@ -1,2 +0,0 @@
export { getPocketBaseConfig } from "@/config/services.config";
export type { PocketBaseConfig } from "@/config/services.config";

View File

@@ -1,6 +1,6 @@
export {
pbLogin,
pbRegister,
emailLogin,
googleLogin,
pbSaveAuth,
pbLogout,
getStoredUser,
@@ -9,4 +9,3 @@ export {
} from "./auth";
export type { AuthUser, AuthResult } from "./auth";
export { PB_STORAGE_KEYS } from "./constants";
export { getPocketBaseConfig } from "./config";