π lib/passport/localStrategy.js
npm install bcrypt
npm install passport-local
import LocalStrategy from 'passport-local';
import bcrypt from 'bcrypt';
import prisma from '../prisma.js';
export const localStrategy = new LocalStrategy(async function (
username,
password,
done
) {
const user = await prisma.user.findUnique({ where: { username } });
if (!user) {
return done(null, false);
}
const isPasswordValid = await bcrypt.compare(password, user.password);
if (!isPasswordValid) {
return done(null, false);
}
done(null, user);
});
π lib/passport/jwtStrategy.js
import { Strategy as JwtStrategy } from 'passport-jwt';
import prisma from '../prisma.js';
import {
ACCESS_TOKEN_COOKIE_NAME,
REFRESH_TOKEN_COOKIE_NAME,
JWT_ACCESS_TOKEN_SECRET,
JWT_REFRESH_TOKEN_SECRET,
} from '../constants.js'; // lib
const accessTokenOptions = {
jwtFromRequest: (req) => req.cookies[ACCESS_TOKEN_COOKIE_NAME],
secretOrKey: JWT_ACCESS_TOKEN_SECRET,
};
const refreshTokenOptions = {
jwtFromRequest: (req) => req.cookies[REFRESH_TOKEN_COOKIE_NAME],
secretOrKey: JWT_REFRESH_TOKEN_SECRET,
};
async function jwtVerify(payload, done) {
try {
const user = await prisma.user.findUnique({
where: { id: payload.sub },
});
done(null, user);
} catch (error) {
done(error, false);
}
}
export const accessTokenStrategy = new JwtStrategy(
accessTokenOptions,
jwtVerify
);
export const refreshTokenStrategy = new JwtStrategy(
refreshTokenOptions,
jwtVerify
);
π lib/passport/oathStrategy.js
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import { GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET } from '../constants.js';
import prisma from '../prisma.js';
export const googleStrategy = new GoogleStrategy(
{
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: 'http://localhost:3000/auth/google/callback',
},
async function (accessToken, refreshToken, profile, cb) {
const user = await prisma.user.findUnique({
where: { provider: 'google', providerId: profile.id },
});
if (user) {
return cb(null, user);
}
const newUser = await prisma.user.create({
data: {
provider: 'google',
providerId: profile.id,
username: profile.id,
password: null,
},
});
return cb(null, newUser);
}
);
π lib/passport/index.js
import passport from 'passport';
import prisma from '../prisma.js';
import { localStrategy } from './localStrategy.js';
import { accessTokenStrategy, refreshTokenStrategy } from './jwtStrategy.js';
import { googleStrategy } from './oauthStrategy.js';
passport.use('local', localStrategy);
passport.use('access-token', accessTokenStrategy);
passport.use('refresh-token', refreshTokenStrategy);
passport.use('google', googleStrategy);
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(async function (id, done) {
const user = await prisma.user.findUnique({ where: { id } });
done(null, user);
});
export default passport;
Top comments (0)