本仓库是YouTube视频的配套内容:https://youtu.be/CcrgG5MjGOk
passport.use( new Strategy( { clientId: process.env.DISCORD_CLIENT_ID!, clientSecret: process.env.DISCORD_SECRET_ID!, callbackUrl: `${process.env.API_URL}/auth/discord/callback`, scope: ["identify"], }, async (_accessToken, _refreshToken, profile, done) => { // 1. 获取id const discordId = profile._json.id as string; // 2. 数据库查询 let user = await db.query.users.findFirst({ where: eq(usersTable.discordId, discordId), }); // 3. 如果用户不存在则创建 if (!user) { [user] = await db .insert(usersTable) .values({ discordId, }) .returning(); } // 4. 返回用户 done(null, user); } ) as any );
const createAuthTokens = ( user: DbUser ): { refreshToken: string; accessToken: string } => { const refreshToken = jwt.sign( { userId: user.id, refreshTokenVersion: user.refreshTokenVersion }, process.env.REFRESH_TOKEN_SECRET!, { expiresIn: "30d", } ); const accessToken = jwt.sign( { userId: user.id }, process.env.ACCESS_TOKEN_SECRET!, { expiresIn: "15min", } ); return { refreshToken, accessToken }; };
// __prod__是一个布尔值,当NODE_ENV为"production"时为true const cookieOpts = { httpOnly: true, secure: __prod__, sameSite: "lax", path: "/", domain: __prod__ ? `.${process.env.DOMAIN}` : "", maxAge: 1000 * 60 * 60 * 24 * 365 * 10, // 10年 } as const; export const sendAuthCookies = (res: Response, user: DbUser) => { const { accessToken, refreshToken } = createAuthTokens(user); res.cookie("id", accessToken, cookieOpts); res.cookie("rid", refreshToken, cookieOpts); };
如果你还没有VPS,可以选择像Hostinger这样的服务提供商。在结账时使用代码BENAWAD
可获得额外优惠(赞助内容)
dokku apps:create api
dokku postgres:link pg api
docker build -t example/auth:1 . --platform=linux
docker image save example/auth:1 | ssh root@123.23.21.31 docker load
docker tag example/auth:1 dokku/api:latest
dokku deploy api latest
dokku config:set api FRONTEND_URL=https://example.com ACCESS_TOKEN_SECRET=hj890duj01jd9012j0dj9021390132 REFRESH_TOKEN_SECRET=q90wej9201je091212903291308 DISCORD_SECRET_ID=asdj902j1d0921 DISCORD_CLIENT_ID=129032180312 DOMAIN=example.com
dokku domains:set api api.example.com
https://www.hostinger.com/tutorials/vps-security
我喜欢使用Cloudflare pages