- Authentification locale avec email/mot de passe - OAuth Manus pour les utilisateurs de la plateforme Le contexte tRPC gère automatiquement les deux types de tokens (JWT local et JWT OAuth).
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import type { CreateExpressContextOptions } from "@trpc/server/adapters/express";
|
|
import type { User } from "../../drizzle/schema";
|
|
import { verifyToken } from "./auth";
|
|
import { getUserById, getUserByOpenId } from "../db";
|
|
import { COOKIE_NAME } from "@shared/const";
|
|
import { sdk } from "./sdk";
|
|
|
|
export type TrpcContext = {
|
|
req: CreateExpressContextOptions["req"];
|
|
res: CreateExpressContextOptions["res"];
|
|
user: User | null;
|
|
};
|
|
|
|
export async function createContext(
|
|
opts: CreateExpressContextOptions
|
|
): Promise<TrpcContext> {
|
|
let user: User | null = null;
|
|
|
|
try {
|
|
// Essayer de récupérer le token depuis le cookie d'abord
|
|
let token = opts.req.cookies[COOKIE_NAME];
|
|
|
|
// Si pas de cookie, essayer le header Authorization
|
|
if (!token) {
|
|
const authHeader = opts.req.headers.authorization;
|
|
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
token = authHeader.substring(7);
|
|
}
|
|
}
|
|
|
|
if (token) {
|
|
// Essayer d'abord l'authentification locale (JWT avec userId)
|
|
try {
|
|
const decoded = verifyToken(token);
|
|
if (decoded && decoded.userId) {
|
|
user = await getUserById(decoded.userId) || null;
|
|
}
|
|
} catch (localAuthError) {
|
|
// Si l'authentification locale échoue, essayer OAuth
|
|
const session = await sdk.verifySession(token);
|
|
if (session && session.openId) {
|
|
user = await getUserByOpenId(session.openId) || null;
|
|
}
|
|
}
|
|
}
|
|
} catch (error) {
|
|
// Authentication is optional for public procedures.
|
|
user = null;
|
|
}
|
|
|
|
return {
|
|
req: opts.req,
|
|
res: opts.res,
|
|
user,
|
|
};
|
|
}
|