10. Node 가계부 만들기 [ 로그인 passport 전략 생성 ] - 2

2022. 5. 28. 19:28프로젝트/가계부 - 제작 JavaScript

passport를 이용 하여 로그인 기능, jwt 검증을 만든다.

passport.js파일에 passport-local, passport-jwt 전략 생성

 

1. passport-local 전략 생성

usernameField : 받는 아이디 파라미터 이름

passwordField : 받는 비밀번호 파라미터 이름

을 넣어준다.

 

1-1. 받은 유저 아이디 값으로 해당 유저가 존재하는지 DB 검색을 한다.

 

1-2. 유저가 존재하면 salt값과 password값을 DB검색을 하고 Password() 함수에 유저가 보낸 비빌번호값, salt값을 넣어준다.

 

1-3. Password()함수를 이용해 password (hash값)을 만들고 DB에 있는 password값과 비교 한 후 같다면 return done 값에 DB에서 나온 유저 데이터를 넣어준다.

 

 

1-1 ~ 1-3 까지 코드가 진행되는 중간에 아이디나 비밀번호가 틀렸다면 return done에 false를 넣는다

const passport = require('passport')
const localPassport = require('passport-local')
const Users = require('../../models/user')
const { Password } = require('../../lib/lib')
const LocalStrategy = localPassport.Strategy

const LocalPassport = passport.use(
  new LocalStrategy(
    {
      usernameField: 'id',
      passwordField: 'pwd'
    },
    async (id, pwd, done) => {
      const user = await Users.findOne({ where: { id } })
      if (user === null) {
        return done(null, false)
      } else {
        const userPassword = user.password
        const salt = user.salt
        const pwdCheck = Password({ pwd, salt })
        if (userPassword === pwdCheck) {
          return done(null, user)
        } else {
          return done(null, false)
        }
      }
    }
  )
)

 

2. passport-jwt 전략 생성

 

jwtFromRequest : 토큰이 들어 가 있는 헤더 값

secretOrKey : JWT 키 값

 

1-1. 토큰에 넣은 유저 값을 payload를 이용해 해당 유저가 존재하는지 DB에 검색을 한다.

 

1-2. 유저가 존재하면 유저의 정보를 return done에 넣어준다.

 

env 값

* process.env.JWT 값은 환경변수로 설정 한 값이다.

const passport = require('passport')
const jwtPassport = require('passport-jwt')
const Users = require('../../models/user')
const JwtStrategy = jwtPassport.Strategy
const ExtractJwt = jwtPassport.ExtractJwt
const JWT = process.env.JWT

const JwtPassport = passport.use(
  new JwtStrategy(
    {
      jwtFromRequest: ExtractJwt.fromHeader('authorization'),
      secretOrKey: JWT
    },
    async (payload, done) => {
      try {
        const index = payload.check
        const user = await Users.findOne({ where: { index } })
        if (user) {
          return done(null, user.index)
        } else {
          return done(null, false)
        }
      } catch (E) {
        return done(E)
      }
    }
  )
)

 

3. passport.js 최종

const passport = require('passport')
const localPassport = require('passport-local')
const jwtPassport = require('passport-jwt')
const Users = require('../../models/user')
const { Password } = require('../../lib/lib')
const LocalStrategy = localPassport.Strategy
const JwtStrategy = jwtPassport.Strategy
const ExtractJwt = jwtPassport.ExtractJwt
const JWT = process.env.JWT

const LocalPassport = passport.use(
  new LocalStrategy(
    {
      usernameField: 'id',
      passwordField: 'pwd'
    },
    async (id, pwd, done) => {
      const user = await Users.findOne({ where: { id } })
      if (user === null) {
        return done(null, false)
      } else {
        const userPassword = user.password
        const salt = user.salt
        const pwdCheck = Password({ pwd, salt })
        if (userPassword === pwdCheck) {
          return done(null, user)
        } else {
          return done(null, false)
        }
      }
    }
  )
)

const JwtPassport = passport.use(
  new JwtStrategy(
    {
      jwtFromRequest: ExtractJwt.fromHeader('authorization'),
      secretOrKey: JWT
    },
    async (payload, done) => {
      try {
        const index = payload.check
        const user = await Users.findOne({ where: { index } })
        if (user) {
          return done(null, user.index)
        } else {
          return done(null, false)
        }
      } catch (E) {
        return done(E)
      }
    }
  )
)

module.exports = { LocalPassport, JwtPassport }

 

 

728x90
반응형