[Boiler Plate](5)ログイン&Token&Cookie


今会員加入が完了しましたので、登録を始めましょう!🌷

1. Login router


優先インデックス.jsにルータを作成します.
app.post('/api/user/login',(req,res)=>{})

2.電子メールの検索


クライアントが要求する電子メールがデータベース内の電子メールであるかどうかを確認する必要があります.
mongodyで提供される関数findOne()を使用します.
Eメールにはすべてのユーザーが必要なため、データベースには1つのオブジェクトしか表示されません.
User.findOne({email:req.body.email}, (err, user)=>{
    // user not found!
    if(!user){
      return res.json({
        loginSuccess : false,
        message : "제공된 이메일에 해당하는 유저가 없습니다."
      })
    }
})

3.パスワードの検索


必要なEメールがある場合は、パスワードを確認する必要があります.
comparePasswordというメソッドを作成します.
passwordを渡し、isMatchでパスワードが一致しているかどうかを確認します.
User.findOne({email:req.body.email}, (err, user)=>{
    // user not found!
    if(!user){
      return res.json({
        loginSuccess : false,
        message : "제공된 이메일에 해당하는 유저가 없습니다."
      })
    }
    
    
    user.comparePassword(req.body.password , (err,isMatch)=>{
      if(!isMatch) 
      	return res.json({loginSuccess: false, message:"비밀번호가 틀렸습니다."})
    })
})
Passwordの比較方法はUserです.jsで作られています.
データベースに格納されているパスワードは暗号化されており、復号する必要があります.
bcryptが提供する比較関数.
クライアントが受信したパスワードとユーザーの暗号化パスワードを比較します.
結果はisMatchによってcallback関数に渡される.
userSchema.methods.comparePassword = function (plainPassword, callback) {
    bcrypt.compare(plainPassword,this.password,function(err,isMatch){
        if(err) return callback(err)
        callback(null,isMatch)
    })
}

4.Tokenの作成


パスワードが一致すると、ユーザーのtokenが生成されます.
今回もcomparePasswordのようにcreateTokenメソッドを作成します.
      user.createToken((err,user)=>{
        if(err) return res.status(400).send(err)

      })
まずjsonwebtokenライブラリをダウンロードしてトークンを作成します.
npm install jsonwebtoken --save
インストール後のユーザー.jsファイルにcreateTokenメソッドを追加します.
トークンはuserのidとsecretTokenによって作成されます.
すなわち、user.id+“secretToken”=token.
「secretToken」を追加するときuser.idがわかります.
const jwt = require('jsonwebtoken')

userSchema.methods.createToken=function (callback){
    let user = this

    //jsonwebtoken을 이용해서 토큰생성
    
    let token = jwt.sign(user._id.toHexString(), "secretToken")

    user.token=token
    user.save(function(err,user){
        if(err) return callback(err)

        callback(null,user)
    })
}
作成したトークンをuserトークンに入力し、データベースに保存します.次にuserの情報をcallback関数に渡します.

5.生成したトークンをクッキーに保存する🍪


トークンが作成され、クッキーに格納されます.クッキーはユーザー認証中に使用されます!

cookie-解析器をインストールします.
npm install cookie-parser --save
const cookieParser = require('cookie-parser')
app.use(cookieParser())
index.jsファイルにトークンを作成し、クッキーに保存します.
user.createToken((err,user)=>{
        if(err) return res.status(400).send(err)

        // 토큰을 저장한다. 쿠키나 로컬 스토리지에 저장할 수 있다.
         res.cookie('x_auth',user.token)
         .status(200)
         .json({loginSuccess:true, userId:user._id})

      })
    })

Mongo DB確認



/loginルーティング完全コード

app.post('/api/user/login',(req,res)=>{
  // 요청한 이메일을 데이터베이스에서 있는지 찾는다.
  User.findOne({email:req.body.email}, (err, user)=>{
    // user not found!
    if(!user){
      return res.json({
        loginSuccess : false,
        message : "제공된 이메일에 해당하는 유저가 없습니다."
      })
    }
    //요청된 이메일이 있다면 비밀번호가 맞는지 확인
    // 메서드는 user 모델에서 만든다.
    user.comparePassword(req.body.password , (err,isMatch)=>{
      if(!isMatch) return res.json({loginSuccess: false, message:"비밀번호가 틀렸습니다."})

      // 비밀 번호가 맞으면 토큰을 생성
      user.createToken((err,user)=>{
        if(err) return res.status(400).send(err)

        // 토큰을 저장한다. 쿠키나 로컬 스토리지에 저장할 수 있다.
         res.cookie('x_auth',user.token)
         .status(200)
         .json({loginSuccess:true, userId:user._id})

      })
    })
  })
})