Files
InviCanvas/server/auth.ts
2026-01-16 17:06:43 +01:00

55 lines
1.4 KiB
TypeScript

import passport from 'passport';
import { Strategy as GitHubStrategy } from 'passport-github2';
import { db } from './database';
const callbackURL = process.env.CALLBACK_URL || '/auth/github/callback';
passport.serializeUser((user: any, done) => {
done(null, user.id);
});
passport.deserializeUser((id: number, done) => {
try {
const stmt = db.prepare('SELECT * FROM users WHERE id = ?');
const user = stmt.get(id);
done(null, user);
} catch (error) {
done(error, null);
}
});
passport.use(new GitHubStrategy({
clientID: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
callbackURL: callbackURL
}, async (accessToken, refreshToken, profile, done) => {
try {
let user;
const existingUser = db.prepare('SELECT * FROM users WHERE github_id = ?').get(profile.id);
if (existingUser) {
user = existingUser;
} else {
const stmt = db.prepare(`
INSERT INTO users (github_id, username, display_name, avatar_url, email)
VALUES (?, ?, ?, ?, ?)
`);
const result = stmt.run(
profile.id,
profile.username,
profile.displayName || profile.username,
profile._json.avatar_url,
profile._json.email
);
user = db.prepare('SELECT * FROM users WHERE id = ?').get(result.lastInsertRowid);
}
return done(null, user);
} catch (error) {
return done(error, undefined);
}
}));
export { passport };