Node-Auth


Node-Auth
Code Github
Blog
目次
  • 概要
  • 需要
  • に必要なツールおよびパッケージ
  • プロジェクト設定
  • MongoDBデータベースとユーザーモデル設定
  • User Signup
  • User Login
  • トークンを用いるログインユーザ情報
  • をインポートする.
    1.紹介
    認証(Authentication)-ユーザーの一貫性を検証するプロセス
    認証(Authorization)-タスクが認証されているかどうかを確認し、認証します.
    2.必要node jsを取り付ける必要があります.
    3.必要なツールとパッケージ

  • express
    express
    ExpressはNodeです.JS Webアプリケーションフレームワーク

  • express-validator
    express-validator
    Expressフレームワークのサーバ上のデータを検証するサーバ側リポジトリ

  • body-parser
    body-parser
    PostリクエストからBodyデータを割り当てるためのノード.jsのミドルウェア

  • bcryptjs
    bcryptjs
    パスワードをハッシュしてデータベースに保存すると、管理者もこれらのライブラリにアクセスできません.

  • jsonwebtoken
    jsonwebtoken
    登録用のデータplayload(使用用のデータを送信)を暗号化してトークンを返し、トークンはセキュリティページの検証に使用したり、トークンの有効時間を設定したりすることができます.

  • mongoose
    mongoose
    MongoDB Ojbectモデリングツールとして、承諾とコールバックをサポートする非同期環境です.
  • 4.設定項目
    $ npm init -y
    $ npm install express express-validator body-parser bcryptjs jsonwebtoken mongoose --save
    // index.js
    
    const express = require("express");
    const MongoServer = require("./config/db");
    
    // 몽고서버 시작
    MongoServer();
    
    const app = express();
    
    // 포트
    const PORT = process.env.PORT || 3000;
    
    // 미들웨어
    app.use(bodyParser.json());
    
    app.get("/", (req, res) => {
      res.json({ message: "API working" });
    });
    
    app.listen(PORT, (req, res) => {
      console.log(`Server Started at PORT ${PORT}`);
    });
    5.MongoDBデータベースとユーザーモデルの設定
    MongoDB
    MongoDB Doc

  • データベースの作成
    ≪クラスタ|Cluster|Eas≫-データベースの作成:ユーザー・セットの作成

  • データベース接続情報の取得
    Clusters-CONNECT-Connect Your applicationmongodb+srv://devPark:<password>@react-boiler-plate.ovbtd.mongodb.net/<dbname>?retryWrites=true&w=majority

  • ユーザー・モデルの設定
  • // config/db.js
    
    const mongoose = require("mongoose");
    
    const MongoURI = "Mongo URI";
    
    const MongoServer = async () => {
      try {
        await mongoose.connect(MongoURI, {
          useNewUrlParser: true,
        });
        console.log("Connected to MongoDB !!");
      } catch (e) {
        console.log(e);
        throw e;
      }
    };
    
    module.exports = MongoServer;
  • ユーザーモデル
  • の作成
    // models/User.js
    
    const mongoose = require("mongoose");
    
    const UserSchema = mongoose.Schema({
      username: {
        type: String,
        required: true,
      },
      email: {
        type: String,
        required: true,
      },
      password: {
        type: String,
        required: true,
      },
      createAt: {
        type: Date,
        default: Date.now(),
      },
    });
    
    module.exports = mongoose.model("User", UserSchema);
    6. User Signup
    Postmanを使用する場合は、「Headers」タブで「KEY:Content-Type」を「VALUE:アプリケーション/json」に変更します.
    // routes/user.js
    
    const express = require("express");
    const { check, validationResult } = require("express-validator");
    const bcrypt = require("bcryptjs");
    const jwt = require("jsonwebtoken");
    const router = express.Router();
    
    const User = require("../model/User");
    
    /**
     * @method - POST
     * @param - /signup
     * @description - User SignUp
     */
    
    router.post(
      "/signup",
      [
        check("username", "유효한 username을 입력해주세요.").not().isEmpty(),
        check("email", "유효한 email을 입력해주세요.").isEmail(),
        check("password", "유효한 password를 입력해주세요.").isLength({ min: 6 }),
      ],
    
      async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(400).json({
            errors: errors.array(),
          });
        }
    
        const { username, email, password } = req.body;
    
        try {
          let user = await User.findOne({
            email,
          });
          if (user) {
            return res.status(400).json({
              msg: "유저가 이미 존재합니다.",
            });
          }
    
          user = new User({
            username,
            email,
            password,
          });
    
          const salt = await bcrypt.genSalt(10);
          user.password = await bcrypt.hash(password, salt);
    
          await user.save();
    
          const payload = {
            user: {
              id: user.id,
            },
          };
    
          jwt.sign(payload, "secret", { expiresIn: 10000 }, (err, token) => {
            if (err) throw err;
            res.status(200).json({
              token,
            });
          });
        } catch (err) {
          console.log(err.message);
          res.status(500).send("데이터를 저장하는데 에러가 생겼습니다.");
        }
      }
    );
    
    module.exports = router;
    // index.js
    
    const express = require("express");
    const MongoServer = require("./config/db");
    const bodyParser = require("body-parser"); // 새로 추가
    const user = require("./routes/user"); // 새로 추가
    
    // 몽고서버 시작
    MongoServer();
    
    const app = express();
    
    // 포트
    const PORT = process.env.PORT || 3000;
    
    // 미들웨어
    app.use(bodyParser.json());
    
    app.get("/", (req, res) => {
      res.json({ message: "API working" });
    });
    
    /**
     * Router Middleware
     * Router - /user/*
     * Method - *
     */
    app.use("/user", user); // 새로 추가
    
    app.listen(PORT, (req, res) => {
      console.log(`Server Started at PORT ${PORT}`);
    });
    7. User Login
    // routes/user.js
    
    router.post(
      "/login",
      [
        check("email", "유효한 eamil을 입력해주세요.").isEmail(),
        check("password", "유효한 비밀번호를 입력해주세요.").isLength({
          min: 6,
        }),
      ],
      async (req, res) => {
        const erros = validationResult(req);
    
        if (!erros.isEmpty()) {
          return res.status(400).json({
            erros: erros.array(),
          });
        }
        const { email, password } = req.body;
        try {
          let user = await User.findOne({ email });
          if (!user)
            return res.status(400).json({
              message: "유저가 존재하지 않습니다.",
            });
    
          const isMatch = await bcrypt.compare(password, user.password);
          if (!isMatch)
            return res.status(400).json({
              message: "비밀번호가 일치하지 않습니다!",
            });
    
          const payload = {
            user: {
              id: user.id,
            },
          };
    
          jwt.sign(payload, "secret", { expiresIn: 3600 }, (err, token) => {
            if (err) throw err;
            res.status(200).json({ token });
          });
        } catch (e) {
          console.error(e);
          res.status(500).json({
            message: "서버 에러",
          });
        }
      }
    );
    8.トークンを使用してログインユーザ情報をインポートする
    auth
    ヘッダーのマークでuserに戻ることができます.
    // routes/user.js
    
    const auth = require("../middleware/auth");
    
    /**
     * @method - GET
     * @description - Get LoggedIn User
     * @param - /user/me
     */
    
    router.get("/me", auth, async (req, res) => {
      try {
        // 미들웨어에서 토큰 인증을 하면 req.user를 가져올수있다.
        const user = await User.findById(req.user.id);
        res.json(user);
      } catch (e) {
        res.send({ message: "유저정보를 가져오는데 실패했습니다." });
      }
    });
    findByID vs findOne
    findByIdはfindOneより便利な関数です.
    サンプルソース
    Model.findById = function findById(id, fields, options, callback) {
      return this.findOne({ _id: id }, fields, options, callback);
    };
    ミドルウェア
    authミドルウェアはトークンを検証し,トークンペイロードに基づくユーザを検索して取得する.
    // middleware/auth.js
    
    const jwt = require("jsonwebtoken");
    
    module.exports = function (req, res, next) {
      const token = req.header("token");
      if (!token) return res.status(401).json({ message: "인증 에러" });
    
      try {
        const decoded = jwt.verify(token, "secret");
        req.user = decoded.user;
        next();
      } catch (e) {
        console.error(e);
        res.status(500).send({ message: "유효하지않는 토큰입니다." });
      }
    };
    テスト
    郵便配達人(GETリクエスト)localhost:3000/user/me会員加入後、登録してトークンを取得し、コピーしてリーダーに入れます.(KEY:token,VALUE:取得したトークン)