53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import passport from 'passport';
|
|
import { Strategy as GitHubStrategy } from 'passport-github2';
|
|
import { db } from './database';
|
|
|
|
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: '/auth/github/callback'
|
|
}, 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 }; |