sql >> データベース >  >> NoSQL >> MongoDB

JWTによるNodeJSおよびMongoDBアプリケーション認証

    このブログでは、NodeJSWebアプリケーションでJWTを使用した認証を実装します。このために、 jsonwebtokenを使用します パッケージ

    JWTとは何ですか?

    JWT(JSON Web Token)はトークン形式です。それはデジタル署名され、自己完結型で、コンパクトです。データを転送するための便利なメカニズムを提供します。 JWTは本質的に安全ではありませんが、JWTを使用すると、署名が検証され、ペイロードの整合性が保証される限り、メッセージの信頼性を確保できます。 JWTは、複雑でないシステムを含む単純なユースケースでステートレス認証によく使用されます。

    JWTの例を次に示します。

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

    それでは、いくつかのルートを認証/保護しましょう。

    前提条件:

    • HTML/JavaScriptの基本的な知識
    • NodeJSをシステムにインストールする必要があります。
    • サーバーを作成するためのエクスプレスモジュール。
    • MongoDB接続とクエリ用のmongooseモジュール。
    • ハッシュ用のbcryptモジュール。

    次のコマンドを使用して、必要なすべてのパッケージをインストールできます。

    npm install express mongoose bcrypt  --save

    ステップ1.まず、以下のようなディレクトリ構造を作成します:

    JWTApp

    -api
    --models
    ----userModel.js
    --controllers
    ----userController.js
    --route
    ----userRoute.js
    --server.js

    ステップ2.「 jsonwebtoken」をインストールします 」次のコマンドを使用してパッケージ化する

     npm install jsonwebtoken -- save

    ステップ3.ユーザーモデルを作成します

    api / modelsフォルダーで、touch api / models / userModel.jsを実行して、useruserModel.jsというファイルを作成します。

    このファイルで、次のプロパティを使用してマングーススキーマを作成します。

    • フルネーム
    • メールアドレス
    • パスワード
    • 作成日

    次のコードを追加します

    'use strict';
    
    var mongoose = require('mongoose'),
      bcrypt = require('bcrypt'),
      Schema = mongoose.Schema;
    
    /**
     * User Schema
     */
    var UserSchema = new Schema({
      fullName: {
        type: String,
        trim: true,
        required: true
      },
      email: {
        type: String,
        unique: true,
        lowercase: true,
        trim: true,
        required: true
      },
      hash_password: {
        type: String
      },
      created: {
        type: Date,
        default: Date.now
      }
    });
    
    UserSchema.methods.comparePassword = function(password) {
      return bcrypt.compareSync(password, this.hash_password);
    };
    
    mongoose.model('User', UserSchema);

    ステップ4.ユーザーハンドラーを作成します

    api / controllers フォルダで、touch api / controllers / userController.js

    を実行して、useruserController.jsというファイルを作成します。

    userControllerファイルで、次のコードを使用して処理する3つの異なるハンドラーを作成します

    'use strict';
    
    var mongoose = require('mongoose'),
      jwt = require('jsonwebtoken'),
      bcrypt = require('bcrypt'),
      User = mongoose.model('User');
    
    exports.register = function(req, res) {
      var newUser = new User(req.body);
      newUser.hash_password = bcrypt.hashSync(req.body.password, 10);
      newUser.save(function(err, user) {
        if (err) {
          return res.status(400).send({
            message: err
          });
        } else {
          user.hash_password = undefined;
          return res.json(user);
        }
      });
    };
    
    exports.sign_in = function(req, res) {
      User.findOne({
        email: req.body.email
      }, function(err, user) {
        if (err) throw err;
        if (!user || !user.comparePassword(req.body.password)) {
          return res.status(401).json({ message: 'Authentication failed. Invalid user or password.' });
        }
        return res.json({ token: jwt.sign({ email: user.email, fullName: user.fullName, _id: user._id }, 'RESTFULAPIs') });
      });
    };
    
    exports.loginRequired = function(req, res, next) {
      if (req.user) {
        next();
      } else {
    
        return res.status(401).json({ message: 'Unauthorized user!!' });
      }
    };
    exports.profile = function(req, res, next) {
      if (req.user) {
        res.send(req.user);
        next();
      } 
      else {
       return res.status(401).json({ message: 'Invalid token' });
      }
    };

    注: ハッシュパスワードはbcryptを使用してデータベースに保存されました。

    ステップ6.api / routeで フォルダに、user userRoute.jsというファイルを作成し、次のコードを追加します。

    'use strict';
    module.exports = function(app) {
        var userHandlers = require('../controllers/userController.js');
        // todoList Routes
        app.route('/tasks')
            .post(userHandlers.loginRequired, userHandlers.profile);
        app.route('/auth/register')
            .post(userHandlers.register);
       app.route('/auth/sign_in')
            .post(userHandlers.sign_in);
    };

    ステップ7.server.jsに次のコードを追加します

    'use strict';
    
    var express = require('express'),
      app = express(),
      port = process.env.PORT || 3000,
    
    
      User = require('./api/models/userModel'),
      bodyParser = require('body-parser'),
      jsonwebtoken = require("jsonwebtoken");
    
    const mongoose = require('mongoose');
    const option = {
        socketTimeoutMS: 30000,
        keepAlive: true,
        reconnectTries: 30000
    };
    
    const mongoURI = process.env.MONGODB_URI;
    mongoose.connect('mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb', option).then(function(){
        //connected successfully
    }, function(err) {
        //err handle
    });
    
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    
    app.use(function(req, res, next) {
      if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {
        jsonwebtoken.verify(req.headers.authorization.split(' ')[1], 'RESTFULAPIs', function(err, decode) {
          if (err) req.user = undefined;
          req.user = decode;
          next();
        });
      } else {
        req.user = undefined;
        next();
      }
    });
    var routes = require('./api/routes/userRoutes');
    routes(app);
    
    app.use(function(req, res) {
      res.status(404).send({ url: req.originalUrl + ' not found' })
    });
    
    app.listen(port);
    
    console.log(' RESTful API server started on: ' + port);
    
    module.exports = app;

    ステップ9.次のコマンドを使用してプロジェクトを実行し、JWTを使用してロギングを試す必要があります。

    npm start

    ステップ10.Postmanを開き、 localhost:3000 / auth / registerへの投稿リクエストを作成します 以下のように:

    ステップ11.この後、このURLで署名しましょう localhost:3000 / auth / sign_in 。メールアドレスとパスワードのキーと値を入力してください

    値の下に、次のようにJWTとトークンを間にスペースを入れて追加します。

    JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

    ステップ11.次に、プロファイルをフェッチするためのキーと値のパラメーターを入力します。以下に示すように作成して送信します:

    これまで見てきたように、NodeJSを使用してJWT認証システムを構築するのはかなり簡単です。このチュートリアルで使用されている完全なコードは、ここにあります。

    注:このツールを使用して、JWTトークンの詳細をデコードまたは確認できます


    1. 配列内の一致数によるMongoの並べ替え

    2. Kubernetesから透過的な巨大ページを無効にする

    3. MongoDBerrno111への接続が拒否されました

    4. Redis —大きな地図を保存するための最良の方法(辞書)