5. Login

김종민·2022년 4월 21일
0

insta-backend

목록 보기
5/37
  1. login.typeDefs.js
import { gql } from 'apollo-server'

export default gql`
  type LoginResult {
    ok: Boolean!
    token: String
    error: String
  }
  type Mutation {
    login(username: String!, password: String!): LoginResult!
  }
`
  1. login.resolvers.js
import prisma from '../../client'
import bcrypt from 'bcryptjs'
import jwt from 'jsonwebtoken'

export default {
  Mutation: {
    login: async (_, { username, password }) => {
      const user = await prisma.user.findFirst({ where: { username } })
      if (!user) {
        return {
          ok: false,
          error: 'User not found',
        }
      }
      const passwordOk = await bcrypt.compare(password, user.password)
      if (!passwordOk) {
        return {
          ok: false,
          error: 'Incorrect password',
        }
      }
      const token = await jwt.sign({ id: user.id }, process.env.SECRET_KEY, {
        expiresIn: '7d',
      })
      return {
        ok: true,
        token,
      }
    },
  },
}
  1. npm i jsonwebtoken

  2. arg로 usename, password 받은다음 username으로 user가 존재하는 찾음.

  3. user가 존재하면 error~

  4. passwordOk를 만들어서 bcrypt.compare(arg password와 DB의 password를 비교함)

  5. !passwordOk이면 return false and error

  6. token 만듬
    .env에 SECRET_KEY 만듬.
    expiresIn은 token 지속 시간.
    마지막으로 return {ok: true, token}

  7. playground에서 token sdkfpirgjeirgnsdf
    'token' 'sdfgsdfgdsfg' 로 입력하지 않음. '' 반드시 빼고 headers에 입력할것.

  8. console.log(req.headers.token)으로 확인 가능함.

profile
코딩하는초딩쌤

0개의 댓글