DEV Community

Jun Oh Lee
Jun Oh Lee

Posted on

cheating code for post authentication

πŸ“‚ 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);
});
Enter fullscreen mode Exit fullscreen mode

πŸ“‚ 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
);

Enter fullscreen mode Exit fullscreen mode

πŸ“‚ 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);
  }
);

Enter fullscreen mode Exit fullscreen mode

πŸ“‚ 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;

Enter fullscreen mode Exit fullscreen mode

Top comments (0)