Toggle navigation
Toggle navigation
This project
Loading...
Sign in
박민정
/
We-Shop
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
박민정
2021-06-03 22:57:02 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
4d74b18c787b7df7492829a66458fb6d2e37b13a
4d74b18c
1 parent
03d6239b
[feat] authentication
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
59 additions
and
2 deletions
boiler-plate/index.js
boiler-plate/middleware/auth.js
boiler-plate/models/User.js
boiler-plate/index.js
View file @
4d74b18
...
...
@@ -18,6 +18,8 @@ app.use(cookieParser())
const
mongoose
=
require
(
'mongoose'
)
const
{
auth
}
=
require
(
'./middleware/auth'
)
//이 정보는 비밀임..! 몽고DB아이디랑 비밀번호를 감춰야해..!
mongoose
.
connect
(
config
.
mongoURI
,
{
useNewUrlParser
:
true
,
useUnifiedTopology
:
true
,
useCreateIndex
:
true
,
useFindAndModify
:
false
...
...
@@ -30,7 +32,7 @@ app.get('/', (req, res) => {
// 회원가입 구현
// route의 endpoint는 register
app
.
post
(
'/register'
,
(
req
,
res
)
=>
{
app
.
post
(
'/
api/users/
register'
,
(
req
,
res
)
=>
{
// 회원가입할 때 필요한 정보들을 client에서 가져오면
// 그것들을 데이터베이스에 넣어준다.
...
...
@@ -52,7 +54,7 @@ app.post('/register', (req, res) => {
})
// 로그인 구현
app
.
post
(
'/login'
,
(
req
,
res
)
=>
{
app
.
post
(
'/
api/users/
login'
,
(
req
,
res
)
=>
{
// 1. 요청된 이메일이 데이터베이스에 있는지 찾기
User
.
findOne
({
email
:
req
.
body
.
email
},
(
err
,
user
)
=>
{
if
(
!
user
)
...
...
@@ -79,6 +81,21 @@ app.post('/login', (req, res) => {
})
})
//
app
.
get
(
'/api/users/auth'
,
auth
,(
req
,
res
)
=>
{
// 여기까지 미들웨어(auth) 통과했으면 authentication == true 라는 뜻
res
.
status
(
200
).
json
({
_id
:
req
.
user
.
_id
,
isAdmin
:
req
.
user
.
role
===
0
?
false
:
true
,
// role이 0이면 일반 유저, role이 0이 아니면 관리자.
isAuth
:
true
,
email
:
req
.
user
.
email
,
lastname
:
req
.
user
.
lastname
,
role
:
req
.
user
.
role
,
image
:
req
.
user
.
image
})
})
app
.
listen
(
port
,
()
=>
{
console
.
log
(
`Example app listening at http://localhost:
${
port
}
`
)
})
...
...
boiler-plate/middleware/auth.js
0 → 100644
View file @
4d74b18
const
{
User
}
=
require
(
"../models/User"
);
let
auth
=
(
req
,
res
,
next
)
=>
{
// 인증 처리
// 1. client 쿠키에서 토큰을 가져옴.
let
token
=
req
.
cookies
.
loginCookie
;
// 2. 토큰을 복호화한 후 유저를 찾는다. (User.js에 findByToken(); 있음)
User
.
findByToken
(
token
,
(
err
,
user
)
=>
{
// 에러가 있으면
if
(
err
)
throw
err
;
// 유저가 없으면
if
(
!
user
)
return
res
.
json
({
isAuth
:
false
,
error
:
true
})
// 에러도 없고 유저도 있으면
req
.
token
=
token
;
// token과 user를 request에 넣어줌으로써 index.js에서 request 사용할 수 있음
req
.
user
=
user
;
next
();
});
// 3. 유저가 있으면 인증OK, 유저가 없으면 인증No!
}
// 이 auth를 다른 파일에서도 쓸 수 있도록
module
.
exports
=
{
auth
};
\ No newline at end of file
boiler-plate/models/User.js
View file @
4d74b18
...
...
@@ -90,6 +90,22 @@ userSchema.methods.generateToken = function(cb)
}
userSchema
.
statics
.
findByToken
=
function
(
token
,
cb
)
{
var
user
=
this
;
// 1. 토큰을 decoding
jwt
.
verify
(
token
,
'secretToken'
,
function
(
err
,
decoded
)
{
// 2. 유저 아이디를 이용해서 유저를 찾은 다음에 클라이언트에서 가져온 토큰과 DB에 보관된 토큰이 일치하는지 확인.
user
.
findOne
({
"_id"
:
decoded
,
"token"
:
token
},
function
(
err
,
user
){
// findOne :: mongoDB에 이미 있는 method
// 에러가 나면
if
(
err
)
return
cb
(
err
);
// 에러가 안나면
cb
(
null
,
user
)
})
})
}
// 만든 스키마를 모델로 감싸줌
const
User
=
mongoose
.
model
(
'User'
,
userSchema
)
...
...
Please
register
or
login
to post a comment