プロジェクト1-ログイン機能


ログイン機能


📕ログイン機能


まずルータにログインする必要があります
このログインルータには3つのことがあります

  • DBで要求された電子メールを検索

  • DBに要求された電子メールがある場合は、パスワードが同じかどうかを確認します

  • パスワードが同じ場合はトークンを作成します
    `app.post('/login', (req, res) => { 여기 }`
    上記のコードをインデックスします.jsで作成
  • ここにはそれぞれ次の3種類のコードを付ければいいです

    📗DBで要求された電子メールを検索


    DBで検索するには、まずユーザモデルをインポートします
    その後、MongoDBから提供される方法.findOne()の使用
    該当するユーザーがいなければ、JSONでログインに失敗しました.
    app.post('./login', (req, res) => {
      User.findOne({ email: req.body.email }, (err, user) => {
        if(!user) {
          return res.json({
            loginSuccess: false,
            message: "해당 이메일에 해당하는 유저가 없습니다."
          })
        }
      })
    }
    プレイヤーがいる場合は、次の機能に移動します.

    📘パスワードが同じであることを確認


    パスワードを保存するときにパスワードで暗号化して保存します
    一方通行のみのため、暗号化されたパスワードは解読できません
    したがって、ユーザが入力欄に入力したPalmanPasswordがDBのパスワードと同じかどうか.
    比較のためにplainPasswordを暗号化して比較する必要がある
    だからbcrypt比較の使用
    そのためにはcomparePasswordというメソッドを作成する必要があります.
    パラメータはreqbody.passwordでplainPasswordを入れて、
    第二に、コールバック関数を追加します.
    エラーが発生した場合、コールバックはerr、暗号化パスワード、純粋なパスワードを返します.
    私はisMatchに参加して、正しいかどうかを教えます.
    isMatchはtrueとfalseを返します
    User.jsでメソッドを先に作成する
    userSchema.methods.comparePassword = function(plainPassword, cb) {
        bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
            if(err) return cb(err)
            cb(null, isMatch)
        })
    }
    こうして書き終わったらインデックスjsに次のコードを加える
    app.post('/login', (req, res) => {
      User.findOne({ email: req.body.email }, (err, user) => {
        if(!user) {
          return res.json({
            loginSuccess: false,
            message: "해당 이메일에 해당하는 유저가 없습니다."
          })
        }
    
        user.comparePassword(req.body,password, (err, isMatch) => {
          if(!isMatch){
            return res.json({
              loginSuccess: false,
              message: "비밀번호가 틀렸습니다."
            })
          }
        })
      })
    })
    isMatchがtrueでない場合、ログインに失敗し、失敗を返します.

    📙パスワードが同じ場合はトークンを作成します


    トークンを生成するには、JSONWEBTOKENライブラリをダウンロードする必要があります.
    npm install jsonwebtoken --save
    上記のようにトークンを発行する方法を別途作成する必要があります
    また、作り方の過程はサイトをチェックするだけで、過程がよく表示されます.
    Userは、参照サイトと同時に使用されます.jsメソッドの作成
    userSchema.methods.generateToken = function(cb){
        let user = this
        let token = jwt.sign(user._id.toHexString(), 'secretToken');
    
        user.token = token
        user.save(function(err, user){
            if(err) return cb(err)
            cb(null, user)
        })
    }
    user._IDとsecretTokenを合わせるとtokenが作成されます
    tokenを解析するときにsecretTokenを入れるとuser.idを生成する
    tokenをuserに戻します
    次に、上記の方法をindexとします.jsで使うべき
    index.jsが使用するプロセスは以下の通りです.
    楽が車に戻されたら、status(400)に戻ります.これは間違いを意味します.
    そしてトークンを記憶する必要があり、Cookie、ローカル記憶などを記憶することができる
    ビスケットに保存しましょう.
    Cookieに保存するには、本体を掘るようにライブラリをダウンロードする必要があります.
    クッキーパーサーというライブラリをダウンロードするべきです.
    npm install cookie-parser --save
    次に、上部にconst cookieParser=require(「cookie-parser」)と
    app.useの追加(cookieParser()
    それから私たちはビスケットでコインを貯蔵します.
    app.post('/login', (req, res) => {
      User.findOne({ email: req.body.email }, (err, user) => {
        if(!user) {
          return res.json({
            loginSuccess: false,
            message: "해당 이메일에 해당하는 유저가 없습니다."
          })
        }
    
        user.comparePassword(req.body,password, (err, isMatch) => {
          if(!isMatch){
            return res.json({
              loginSuccess: false,
              message: "비밀번호가 틀렸습니다."
            })
          }
          user.generateToken((err, user) => {
            if(err) {
              return res.status(400).send(err)
            }
                    
            res.cookie("x_auth", user.token)
            .status(200)
            .json({
              loginSuccess: true,
              userId: user._id
            })
          })
        })
      })
    })
    川を上る[email protected]二郎1234 abcd加入会員
    これを使ってpostmanにログインしましょう.http://localhost:3000/loginに設定された後の方法
    その後bodyでraw、JSONを選択し、ここに情報を入力すればよい
    {
    	"email": "[email protected]",
        "password": "1234abcd"
    }
    このままsendしてみよう
    本物のJSONが見えてきます
    コードが混同される可能性があるので、全文を入れます.

    📔コード#コード#


    index.js
    const express = require('express')
    const app = express()
    const port = 3000
    const mongoose = require('mongoose')
    const { User } = require("./models/User")
    const bodyParser = require('body-parser')
    const config = require('./config/key')
    const cookieParser = require('cookie-parser')
    
    app.use(bodyParser.urlencoded({extended: true}))
    app.use(bodyParser.json())
    app.use(cookieParser())
    
    mongoose.connect(config.mongoURI
    ).then( () => console.log('MongoDB Connected'))
     .catch(err => console.log(err))
    
    app.get('/', (req, res) => {
      res.send('Hello World! BooKi')
    })
    
    app.post('/signup', (req, res) => {
      //회원 가입 할 때 작성한 정보들을 가져와 DB에 넣어준다
      const user = new User(req.body)
    
      user.save((err, userInfo) => {
        if (err) return res.json({ success: false, err})
        return res.status(200).json({
          success: true
        })
      })
    })
    
    app.post('/login', (req, res) => {
      User.findOne({ email: req.body.email }, (err, user) => {
        if(!user) {
          return res.json({
            loginSuccess: false,
            message: "해당 이메일에 해당하는 유저가 없습니다."
          })
        }
    
        user.comparePassword(req.body.password, (err, isMatch) => {
          if(!isMatch){
            return res.json({
              loginSuccess: false,
              message: "비밀번호가 틀렸습니다."
            })
          }
          user.generateToken((err, user) => {
            if(err) {
              return res.status(400).send(err)
            }
                    
            res.cookie("x_auth", user.token)
            .status(200)
            .json({
              loginSuccess: true,
              userId: user._id
            })
          })
        })
      })
    })
    
    app.listen(port, () => {
      console.log(`http://localhost:${port}/`)
    })
    user.js
    const mongoose = require('mongoose')
    const bcrypt = require('bcrypt')
    const saltRounds = 10
    const jwt = require('jsonwebtoken')
    
    const userSchema = mongoose.Schema({
        name: {
            type: String,
            maxlength: 50
        },
        email: {
            type: String,
            trim: true,
            unique: 1
        },
        password: {
            type: String,
            minlength: 5
        },
        role: {
            type: Number,
            default: 0
        },
        image: String,
        token: {
            type: String
        },
        tokenExp:{
            type: Number
        }
    })
    
    userSchema.pre('save', function(next){
        let user = this;
    
        if (user.isModified('password')){
            bcrypt.genSalt(saltRounds, function (err, salt) {
                if(err) return next(err)
                bcrypt.hash(user.password, salt, function (err, hash){
                    if(err) return next(err)
                    user.password = hash
                    next()
                })
            })
        } else {
            next()
        }
    })
    
    userSchema.methods.comparePassword = function(plainPassword, cb) {
        bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
            if(err) return cb(err)
            cb(null, isMatch)
        })
    }
    
    userSchema.methods.generateToken = function(cb){
        let user = this
        let token = jwt.sign(user._id.toHexString(), 'secretToken');
    
        user.token = token
        user.save(function(err, user){
            if(err) return cb(err)
            cb(null, user)
        })
    }
    
    const User = mongoose.model('User', userSchema)
    
    module.exports = { User }