import { gql } from 'apollo-server'
export default gql`
type LoginResult {
ok: Boolean!
token: String
error: String
}
type Mutation {
login(username: String!, password: String!): LoginResult!
}
`
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,
}
},
},
}
npm i jsonwebtoken
arg로 usename, password 받은다음 username으로 user가 존재하는 찾음.
user가 존재하면 error~
passwordOk를 만들어서 bcrypt.compare(arg password와 DB의 password를 비교함)
!passwordOk이면 return false and error
token 만듬
.env에 SECRET_KEY 만듬.
expiresIn은 token 지속 시간.
마지막으로 return {ok: true, token}
playground에서 token sdkfpirgjeirgnsdf
'token' 'sdfgsdfgdsfg' 로 입력하지 않음. '' 반드시 빼고 headers에 입력할것.
console.log(req.headers.token)으로 확인 가능함.