import * as jose from 'jose';
import { Request, Response } from 'express';
import { getUserInfo } from '../services/user-info-service';
import { getFeatureFlags } from '../services/feature-flags-service';
const GITBOOK_VISITOR_SIGNING_KEY = process.env.GITBOOK_VISITOR_SIGNING_KEY;
const GITBOOK_VISITOR_COOKIE_NAME = 'gitbook-visitor-token';
export async function handleAppLoginRequest(req: Request, res: Response) {
// 处理登录请求的业务逻辑
// 例如,检查凭据并对用户进行身份验证
//
// 例如:
// const loggedInUser = await authenticateUser(req.body.username, req.body.password);
// 在对用户进行身份验证后,从你的数据库或用户服务中检索你希望
// 传递给 GitBook 的用户信息。
const userInfo = await getUserInfo(loggedInUser.id);
// 使用用户信息构建 JWT 载荷
const gitbookVisitorClaims = {
firstName: userInfo.firstName,
lastName: userInfo.lastName,
isBetaUser: userInfo.isBetaUser
products: userInfo.products.map((product) => product.name),
featureFlags: await getFeatureFlags({userId: loggedInUser.id})
}
// 使用这些声明生成一个已签名的 JWT
const gitbookVisitorJWT = await new jose.SignJWT(gitbookVisitorClaims)
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('2h') // 任意设置为 2 小时过期
.sign(GITBOOK_VISITOR_SIGNING_KEY);
// 在你的登录处理响应中包含一个 `gitbook-visitor-token` cookie,其中包含编码后的 JWT
//
res.cookie(GITBOOK_VISITOR_COOKIE_NAME, gitbookVisitorJWT, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 2 * 60 * 60 * 1000, // 任意设置为 2 小时过期
domain: '.acme.org' //
});
// 其余的登录处理逻辑,包括将用户重定向到你的应用
res.redirect('/'); // 示例重定向
}