티스토리 뷰
728x90
반응형
Logic - 클라이언트가 로그인을 하여 로그인에 성공하면 jwt 토큰을 발행하고 유저 조회 및 유저 정보 수정시 token으로 유저를 판별하여 접근 유무를 확인하는 것입니다.
Case 1 - Prisma를 이용한 Client생성 (client.js)
1
2
3
4
5
|
import { PrismaClient } from ".prisma/client";
const client = new PrismaClient();
export default client;
|
cs |
Case 2 - Server를 실행시켜주는 server.js 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
require('dotenv').config();
import { ApolloServer } from "apollo-server";
import schema from "./schema";
import { getUser } from "./users/users.utils";
const PORT = process.env.PORT;
const server = new ApolloServer({
schema,
context: async ({ req }) => {
return {
loggedInUser: await getUser(req.headers.token)
}
}
});
server
.listen(PORT)
.then(() => console.log(`Server Running... PORT=${PORT}`));
|
cs |
Case 3 - 로그인을 위한 typeDefs(정의)와 resolvers(해결) 선언
1. 로그인을 위한 typeDefs선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import { gql } from "apollo-server";
export default gql`
type LoginResult {
result: Boolean!
token: String
error: String
}
type Mutation {
login(username: String!, password: String!): LoginResult!
}
`;
|
cs |
2. 로그인을 위한 resolvers선언
npm install jsonwebtoken //설치
로그인 성공시 jwt를 발생합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import client from "../../client"
import bcrypt from "bcrypt"
import jwt from "jsonwebtoken"
export default {
Mutation:{
login: async(_, {username, password}) => {
const user = await client.user.findFirst({ where: {username} })
if(!user){
return {
result: false,
error: "유저를 찾지 못하였습니다."
};
}
const passwordResult = await bcrypt.compare(password, user.password);
if(!passwordResult){
return {
result: false,
error: "비밀번호가 일치하지 않습니다."
};
}
//npm install jsonwebtoken // 일치하면 token 발생
const token = await jwt.sign({id: user.id}, process.env.SECRET_KEY);
return {
result: true,
token
}
}
}
}
|
cs |
Case 4 - 유저 조회
1. 유저 조회를 위한 typeDefs선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import { gql } from "apollo-server-core";
export default gql`
type EditProfileResult {
result: Boolean!
error: String
}
type Mutation{
editProfile(
firstName: String
lastName: String
username: String
email: String
password: String
): EditProfileResult
}
`;
|
cs |
2. 선언한 typeDefs에 대한 resolvers선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import client from "../../client"
import bcrypt from "bcrypt"
export default {
Mutation: {
editProfile: async (_, {
firstName, lastName, username, email, password: newPassword
}, { loggedInUser }) => {
console.log(loggedInUser);
let tempPassword = null;
if(newPassword){
tempPassword = await bcrypt.hash(newPassword, 10);
}
const result = await client.user.update({
where:{
id:loggedInUser.id
},
data:{
firstName,
lastName,
username,
email,
...(tempPassword && {password:tempPassword})
}
})
if(result.id){
return{
result: true
}
}else{
return {
result: false,
error: "실패"
}
}
}
}
}
|
cs |
- editProfile을 요청할 때 header에 token을 추가하여 getUesr() 메서드로 해당 유저가 존재하는지 판별후 유저가 존재한다면 유저를 반환하고 그렇지 않다면 NULL을 반환합니다.
- editProfile은 server.js로 부터 loggedInUser 변수를 받아서 해당 User를 찾고 있으며 USer의 id를 이용하여 데이터를 수정하고 있습니다.
728x90
반응형
'React Native' 카테고리의 다른 글
expo - google map mapView의 getMapBoundaries사용 방법 (0) | 2021.09.10 |
---|---|
React Native Expo - Android 구글맵 연동 중 에러 (0) | 2021.09.07 |
React - prisma connectOrCreate사용 방법 (0) | 2021.05.14 |
React - apollo-server-express를 이용한 파일 업로드 방법 (0) | 2021.05.12 |
React - node - 12 이상에서 파일 업로드 버그 (0) | 2021.05.12 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- spring boot redisson destributed lock
- pipeline architecture
- transactional outbox pattern
- pipe and filter architecture
- spring boot redisson sorted set
- space based architecture
- spring boot 엑셀 다운로드
- java ThreadLocal
- spring boot redisson 분산락 구현
- transactional outbox pattern spring boot
- 람다 표현식
- java userThread와 DaemonThread
- 서비스 기반 아키텍처
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- redis sorted set
- 레이어드 아키텍처란
- 트랜잭셔널 아웃박스 패턴 스프링부트
- 공간 기반 아키텍처
- spring boot poi excel download
- @ControllerAdvice
- service based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot redis 대기열 구현
- redis sorted set으로 대기열 구현
- 자바 백엔드 개발자 추천 도서
- redis 대기열 구현
- spring boot excel download paging
- polling publisher spring boot
- microkernel architecture
- spring boot excel download oom
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함