[Web]ノード.js&react会員管理-4


ログイン/ログアウトAPIの作成


index.js
ログイン時にチェックする要素の順に作成し、チェックした要素がfalseの場合にエラーメッセージを送信し、trueの場合は続行します.
  • によって作成されたEメールがデータベースにあるかどうか
  • 正しいパスワードか
  • にログインできる場合は、Token
  • が作成されます.

    1.記入したメールがDBにあるか

    User.findOneは基本関数です.{email: req.body.email} postmanに送信されると、本文からキー「email」の値が取得される
    const cookieParser = require('cookie-parser')
    
    app.post('/api/users/login', (req, res) => {
        //요청된 이메일을 DB에 있는지 찾고
        User.findOne({ email: req.body.email }, (err, user) => {
            if(!user) {
                return res.json({
                    loginSucess: false,
                    message: "제공된 이메일에 해당하는 유저가 없습니다."
                })
            }        
            //있으면 비밀번호가 맞는건지 확인
            user.comparePassword(req.body.password, (err, isMatch) => {
                if(!isMatch)
                return res.json({
                    loginSucess: false,
                    message: "비밀번호가 잘못되었습니다."
                })
            })
            //같으면 Token 생성
            user.generateToken((err, user) => {
                if(err) return res.status(400).send(err);
                
                //생성한 토큰을 user에 넣었고, 어딘가에 저장해야함 쿠키나 로컬 스토리지
                res.cookie("x_auth", user.token)
                .status(200)
                .json({loginSuccess: true, userId: user._id})
            })
        })
    })

    2.正しいパスワードが入力されている

    user.comparePasswordは関数を使用します.jsで作成
    入力したpasswordを暗号化し、既存の暗号化値を比較して一致するとtrueを返します.
    userSchema.methods.comparePassword = function(plainPassword, cb){
        bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
            if(err) return cb(err)
            cb(null, isMatch)
        })
    }

    3.ログイン可能な場合はtokenを作成


    認証ページに接続するには、tokenを作成してクッキー内の任意の場所に保存します.tokenが一致する場合にのみ使用できます.
    npm install jsonwebtoken --save
    インストール
    https://www.npmjs.com/package/jsonwebtoken
    使用方法は次のとおりです.

    このようにしてまずjwtをrequireにインポートする.
    sign関数でtokenを生成する
    User.jsには以下のように記入します.
    const jwt = require('jsonwebtoken');
    
    userSchema.methods.generateToken = function(cb){
        var user = this;
        //json web token을 이용해서 토큰 생성
        var token = jwt.sign(user._id.toHexString(), 'secretToken')
        user.token = token
        user.save(function(err, user){
            if(err) return cb(err)
            cb(null, user)
        })
    
    }
    index.jsが作成したgenerateToken関数を呼び出してtokenを作成
    生成したタグをクッキーに保存する必要があります.
    npm install cookie-parser --save
    そしてインデックスjsでタグを作成する部分
    user.generateToken((err, user) => {
                if(err) return res.status(400).send(err);
                
                //생성한 토큰을 user에 넣었고, 어딘가에 저장해야함 쿠키나 로컬 스토리지
                res.cookie("x_auth", user.token)
                .status(200)
                .json({loginSuccess: true, userId: user._id})
            })
    そうすればいい

    4. auth.js検証チェックの使用



    自由に管理できますが、authはserver>ミドルウェアフォルダのサブフォルダにあります.jsをしました
    auth.jsで作成され、
    「Cookieに格納されているトークン」と「ユーザーモジュール」の比較User.findByToken関数を使用してCookieに格納されたタグを比較に入れてエラーチェックを行います
    const { User } = require('../models/User')
    
    let auth = (req, res, next) => {
        //인증처리를 하는곳
        //DB에서 가지고있는 토큰과 캐시에서 가지고 있는 토큰을 비교
    
        //클라이언트 쿠키에서 토큰을 가져옴
        let token = req.cookies.x_auth;
        
        //토큰 복호화한 후, 유저 찾기
        User.findByToken(token, (err, user) => {
            if(err) throw err;
            if(!user) return res.json({isAuth: false, error: true});
    
            req.token = token;
            req.user = user;
            next();
        })
    }
    
    module.exports = { auth };
    
    User.findByToken関数はUserです.js端でStaticにする
    User.js
    userSchema.statics.findByToken = function(token, cb){
        var user = this;
    
        //가져온 토큰을 decode => User Id가 나옴
        jwt.verify(token, 'secretToken', function(err, decoded){
            user.findOne({"_id": decoded, "token":token}, function(err, user){
                if(err) return cb(err);
                cb(null, user)
            })
        })
    
    }
    
    jwt.verify()の2番目の因子は、トークンを最初に生成したときと同じでなければならない.
    復号タグによって生成された値は、findOne()関数を使用してパラメータを検索する論理であるuser IDを生成する.
    index.jsでauthを呼び出すGET APIを作成して成功、失敗を真にする
    app.get('/api/users/auth', auth, (req, res) => {
        res.status(200).json({
            _id: req.user._id,
            isAdmin: req.user.role === 0 ? false : true,
            isAuth:true,
            email:req.user.email,
            lastname:req.user.lastname,
            role:req.user.role,
            image:req.user.image
        })
    })
    クライアントが画面にアクセスするときにチェックするisAuthとisAdminの値を入力します.

    5.APIのログアウト


    ログインより簡単
    もちろんGET APIですが、authを提供しているのは、登録しなければログアウトできないからです!findOneAndUpdate関数基本関数idを使用してtokenを検索し、tokenを空の文字列に初期化し、idのタグを破棄する
    app.get('/api/users/logout', auth, (req, res) => {
        User.findOneAndUpdate({_id: req.user._id}
            , {token: ""}
            , (err, user) => {
                if(err) return res.json({success: false, err})
                return res.status(200).send({
                    success: true
                })
        })
    })

    6.機能検証


    APIのログアウトを呼び出し、tokenが初期化されているかどうかを確認します.




    tokenが初期化されているのを見てください.