sql >> データベース >  >> RDS >> Mysql

SequelizeおよびMySQLでのPassportの使用

    Sequelizeは、PromiseベースのNode.jsORMです。 PostgreSQL、MySQL、MariaDB、SQLite、およびMSSQLで使用できます。このチュートリアルでは、Webアプリのユーザーに認証を実装します。また、Nodeで人気のある認証ミドルウェアであるPassportを、SequelizeおよびMySQLとともに使用して、ユーザー登録とログインを実装します。

    はじめに

    マシンに次のものがインストールされていることを確認してください。

    • ノード
    • MySQL

    このチュートリアルでは、Node.jsをExpressと一緒に使用するので、先に進んで必要なもののインストールを開始します。

    ステップ1:package.jsonファイルを生成する

    アプリのディレクトリを作成します。このディレクトリ内で、ターミナルまたはコマンドプロンプトからこれを実行します:

     npm init

    これにより、npmDependencyManagerが初期化されます。これにより、すぐに実行する一連のプロンプトが表示されます。

    • スペースを入れずにアプリの名前を入力し、Enterキーを押して「名前」を入力します。
    • 「バージョン」の場合はEnterキーを押します。
    • 「description」の場合、このチュートリアルでは、説明として「Useing Passport with Sequelize and MySQL」と入力し、Enterキーを押します。これも空白にすることができます。
    • 「エントリポイント(index.js)」の場合は、server.jsと入力し、Enterキーを押します。
    • 「テストコマンド」の場合は、Enterキーを押します。
    • 「gitrepository」の場合、アプリが存在するgitリポジトリを入力するか、Enterキーを押して空白のままにします。
    • 「キーワード」の場合は、Enterキーを押します。
    • 「作成者」の場合は、Enterキーを押すか、名前を入力してから実行してください。
    • 「ライセンス」の場合は、Enterキーを押します。
    • '(これは大丈夫ですか)'の場合、package.jsonがどのようになるかを示します。 「はい」と入力してEnterキーを押します。

    ステップ2:依存関係をインストールする

    このチュートリアルの主な依存関係は次のとおりです。

    • エクスプレス
    • 続編
    • MySQL
    • パスポート
    • パスポートローカル戦略
    • ボディパーサー
    • エクスプレスセッション
    • Bcrypt Nodejs
    • ビューのエクスプレスハンドルバー

    それらをインストールするには、ターミナルまたはコマンドプロンプトから、次のコマンドを次々に実行します。

    npm install express --save
    
    npm install sequelize --save
    
    npm install mysql --save
    
    npm install passport --save
    
    npm install passport-local --save
    
    npm install body-parser --save
    
    npm install express-session --save
    
    npm install bcrypt-nodejs --save
    
    npm install express-handlebars --save

    このプロジェクトでGitを使用している場合:

    プロジェクトフォルダに.gitignoreファイルを作成します。

    この行を.gitignoreファイルに追加します。

    node_modules

    ステップ3:アプリを設定する

    次に、サーバーファイルを作成します。これは、次のように入力したときに呼び出されるメインファイルになります。

    npm start

    これでアプリが実行されます。 nodeserver.jsと入力してアプリを実行することもできます。

    node server.js

    次に、プロジェクトフォルダーに新しいファイルを作成し、このファイルに server.jsという名前を付けます。 。

    server.jsの内部 ファイルに、以下を貼り付けます:

    var express = require('express');
    var app = express();
    
    
    app.get('/', function(req, res) {
    
        res.send('Welcome to Passport with Sequelize');
    
    });
    
    
    app.listen(5000, function(err) {
    
        if (!err)
            console.log("Site is live");
        else console.log(err)
    
    });

    最初の行は、expressモジュールを変数expressに割り当てます。次に、expressを初期化し、変数にappという名前を付けます。

    次に、アプリをポート 5000でリッスンさせます 。コンピュータの任意の空きポート番号を選択できます。

    次に、app.get()を呼び出します 「/」に対してGETリクエストが行われたときに「WelcometoPassportwithSequelize」で応答するエクスプレスルーティング機能。

    コンピューターでテストするには、プロジェクトフォルダー内からこれを実行します。

    node server.js

    http:// localhost:5000 /にアクセスしたときに、「Welcome to Passport with Sequelize」というテキストが表示された場合は、おめでとうございます。それ以外の場合は、上記のとおりにすべてを実行したことを確認してください。

    次に、passport、express-session、body-parserなど、必要なモジュールをインポートします。

    var app = express()の後 次の行を追加します:

    var passport   = require('passport')
    var session    = require('express-session')
    var bodyParser = require('body-parser')

    最初の2行では、パスポートモジュールとエクスプレスセッションをインポートします。どちらも認証を処理する必要があります。

    次に、body-parserモジュールをインポートします。これにより、着信リクエストの本文全体が抽出され、操作しやすい形式で公開されます。この場合、JSON形式を使用します。

    アプリでボディパーサーを使用できるようにするには、インポート行の下に次の行をスペースで追加します。

    //For BodyParser
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    の場合

    次に、パスポートとエクスプレスセッションおよびパスポートセッションを初期化し、両方をミドルウェアとして追加します。これを行うには、これらの行をbodyParserインポート行の後にスペースを追加します。

    // For Passport
    
    app.use(session({ secret: 'keyboard cat',resave: true, saveUninitialized:true})); // session secret
    
    app.use(passport.initialize());
    
    app.use(passport.session()); // persistent login sessions

    今から実際の認証に取り組み始めます。

    これは4つのステップで行います:

    • MySQLでSequelizeを設定します。
    • ユーザーモデルを作成します。
    • ビューを設定します。
    • パスポート戦略を作成します。

    1。 MySQLでSequelizeを設定する

    まず、MySQLでデータベースを作成します。好みの名前を付けてください。このチュートリアルのために、sequelize_passportという名前のデータベースを作成しましょう。 MySQLで。

    次に、DBの詳細を処理するための構成をセットアップします。

    まず、dot-envモジュールをインポートして環境変数を処理しましょう。

    ルートプロジェクトフォルダでこれを実行します:

    npm install --save dotenv

    次に、他のインポートのすぐ下にあるメインサーバーファイルserver.jsにインポートします。

    var env = require('dotenv').load(); 

    次に、プロジェクトフォルダーにファイルを作成し、.envという名前を付けます。

    Gitを使用していない場合、次の手順はオプションです:

    .envファイルを.gitignoreファイルに追加します。

    .gitignoreファイルは次のようになります。

    node_modules
    .env

    この後、次の行を追加して、環境を.envファイルに追加します。

    NODE_ENV='development'

    次に、Sequelizeがさまざまな環境を管理するために使用するconfig.jsonファイルを作成します。

    最初に行うことは、configという名前のフォルダーを作成することです。 プロジェクトフォルダにあります。このフォルダ内に、config。を作成します。 json ファイル。リポジトリにプッシュする場合は、このファイルを無視する必要があります。これを行うには、次のコードを.gitignoreに追加します。

    config/config.json

    次に、次のコードをconfig.jsonファイルに貼り付けます。

    {
    
        "development": {
    
            "username": "root",
    
            "password": null,
    
            "database": "sequelize_passport",
    
            "host": "127.0.0.1",
    
            "dialect": "mysql"
    
        },
    
        "test": {
    
            "username": "",
    
            "password": null,
    
            "database": "",
    
            "host": "",
    
            "dialect": "mysql"
    
        },
    
        "production": {
    
            "username": "",
    
            "password": null,
    
            "database": "",
    
            "host": "127.0.0.1",
    
            "dialect": "mysql"
    
        }
    
    }

    上記の開発ブロックの値をデータベース認証の詳細に置き換えることを忘れないでください。

    次に、npmでsequelizeをインストールします。これを行うには、プロジェクトのルートフォルダで次のコマンドを実行します。

    npm install --save sequelize

    次に、モデルを作成します。 フォルダ。

    まず、appという名前のディレクトリを作成します プロジェクトフォルダにあります。

    アプリの内部 フォルダ、モデルという名前の新しいフォルダを作成します index.jsという名前の新しいファイルを作成します モデル フォルダ。

    index.jsファイル内に、以下のコードを貼り付けます。

    "use strict";
    
    var fs = require("fs");
    var path = require("path");
    var Sequelize = require("sequelize");
    var env = process.env.NODE_ENV || "development";
    var config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
    var sequelize = new Sequelize(config.database, config.username, config.password, config);
    var db = {};
    
    
    fs
        .readdirSync(__dirname)
        .filter(function(file) {
            return (file.indexOf(".") !== 0) && (file !== "index.js");
        })
        .forEach(function(file) {
            var model = sequelize.import(path.join(__dirname, file));
            db[model.name] = model;
        });
    
    Object.keys(db).forEach(function(modelName) {
        if ("associate" in db[modelName]) {
            db[modelName].associate(db);
        }
    });
    
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
    
    module.exports = db;

    このファイルは、モデルに配置するすべてのモデルをインポートするために使用されます フォルダを作成し、エクスポートします。

    すべてが正常であることをテストするために、これをserver.jsファイルに追加します。

    //Models
    var models = require("./app/models");
    
    //Sync Database
    models.sequelize.sync().then(function() {
    
        console.log('Nice! Database looks fine')
    
    }).catch(function(err) {
    
        console.log(err, "Something went wrong with the Database Update!")
    
    });

    ここでは、モデルをインポートしてから、Sequelize同期関数を呼び出しています。

    これを実行して、すべてが順調かどうかを確認します:

    node server.js

    「サイトは正常に動作しています。データベースは正常に見えます」というメッセージが表示された場合は、Sequelizeが正常に設定されています。

    そうでない場合は、上記の手順を注意深く確認し、ヘルプを使用して問題をデバッグしてみてください。

    2。ユーザーモデルを作成する

    次に行うことは、基本的にユーザーテーブルであるユーザーモデルを作成することです。これには基本的なユーザー情報が含まれます。

    モデル フォルダにファイルを作成し、 user.jsという名前を付けます 。このファイルのフルパスは、 app / models/user.jsです。

    user.jsファイルを開き、次のコードを追加します。

    module.exports = function(sequelize, Sequelize) {
    
        var User = sequelize.define('user', {
    
            id: {
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER
            },
    
            firstname: {
                type: Sequelize.STRING,
                notEmpty: true
            },
    
            lastname: {
                type: Sequelize.STRING,
                notEmpty: true
            },
    
            username: {
                type: Sequelize.TEXT
            },
    
            about: {
                type: Sequelize.TEXT
            },
    
            email: {
                type: Sequelize.STRING,
                validate: {
                    isEmail: true
                }
            },
    
            password: {
                type: Sequelize.STRING,
                allowNull: false
            },
    
            last_login: {
                type: Sequelize.DATE
            },
    
            status: {
                type: Sequelize.ENUM('active', 'inactive'),
                defaultValue: 'active'
            }
    
    
        });
    
        return User;
    
    }

    今すぐ実行:

    node server.js

    おなじみの「サイトはライブです。いいですね! データベース 問題ないようです。 「メッセージ。これは、Sequelizeモデルが正常に同期されたことを意味します。データベースを確認すると、指定された列が存在するユーザーテーブルが表示されます。

    3:ビューを設定する

    まず、サインアップ用のビューを作成して接続しましょう。

    最初に行うことは、このチュートリアルのビューに使用するエクスプレスハンドルバーモジュールをインポートすることです。

    この行をメインの開始ファイルserver.jsに追加します。

    var exphbs = require('express-handlebars')

    この時点で、インポートブロックは次のようになります。

    var express = require('express')
    var app = express()
    var passport = require('passport')
    var session = require('express-session')
    var bodyParser = require('body-parser')
    var env = require('dotenv').load()
    var exphbs = require('express-handlebars')

    次に、server.jsファイルに次の行を追加します。

    //For Handlebars
    app.set('views', './app/views')
    app.engine('hbs', exphbs({
        extname: '.hbs'
    }));
    app.set('view engine', '.hbs');

    ここで、appフォルダーに、 views、という名前の3つのフォルダーを作成します。 コントローラー、 およびルート

    ビューフォルダに、signup。という名前のファイルを作成します。 hbs 以下のコードを貼り付けてください。

    <!DOCTYPE html>
    <html>
    
    <head>
        <title></title>
    </head>
    
    <body>
        <form id="signup" name="signup" method="post" action="/signup">
            <label for="email">Email Address</label>
            <input class="text" name="email" type="email" />
            <label for="firstname">Firstname</label>
            <input name="firstname" type="text" />
            <label for="lastname">Lastname</label>
            <input name="lastname" type="text" />
            <label for="password">Password</label>
            <input name="password" type="password" />
            <input class="btn" type="submit" value="Sign Up" />
        </form>
    
    </body>
    
    </html>

    次に、コントローラーで フォルダに新しいファイルを作成し、authcontroller.js。という名前を付けます。

    このファイルでは、すぐに作成するサインアップルートに次のコントローラーを貼り付けます。

    var exports = module.exports = {}
    
    exports.signup = function(req, res) {
    
        res.render('signup');
    
    }

    次に、サインアップのルートを作成します。ルートフォルダに、 auth.jsという名前の新しいファイルを作成します 次に、このファイルで、認証コントローラーをインポートし、サインアップルートを定義します。

    var authController = require('../controllers/authcontroller.js');
    
    module.exports = function(app) {
    
        app.get('/signup', authController.signup);
    
    }

    次に、このルートをserver.jsにインポートし、引数としてアプリを渡します。

    サーバーで、モデルをインポートした後、次の行を追加します。

    //Routes
    var authRoute = require('./app/routes/auth.js')(app);

    これを実行します:

    node server.js

    ここで、http:// localhost:5000 / signupにアクセスすると、登録フォームが表示されます。

    サインインフォームの手順を繰り返してみましょう。前と同じように、 signin.hbsという名前のファイルを作成します ビューフォルダに次のHTMLコードを貼り付けます:

    <!DOCTYPE html>
    <html>
    
    <head>
        <title></title>
    </head>
    
    <body>
        <form id="signin" name="signin" method="post" action="signin">
            <label for="email">Email Address</label>
            <input class="text" name="email" type="text" />
            <label for="password">Password</label>
            <input name="password" type="password" />
            <input class="btn" type="submit" value="Sign In" />
        </form>
    
    </body>
    
    </html>

    次に、 app / controllers/authcontroller.jsでサインイン用のコントローラーを追加します。

    exports.signin = function(req, res) {
    
        res.render('signin');
    
    }

    次に、 app / routers / auth.js 、次のようにサインインのルートを追加します:

    app.get('/signin', authController.signin);

    実行すると:

    node server.js

    http:// localhost:5000 / signin /にアクセスすると、サインインフォームが表示されます。

    最後の主要なステップは、パスポート戦略を作成することです。

    4。パスポート戦略を書く

    app / config内 、passportという名前の新しいフォルダを作成します。

    次に、新しいフォルダapp / config / passportで、新しいファイルを作成し、 passport.jsという名前を付けます。 。このファイルには、パスポート戦略が含まれています。

    passport.js 、ユーザーモデルとパスポートを使用します。

    まず、 bcryptをインポートします パスワードを保護する必要があります。

    var bCrypt = require('bcrypt-nodejs');

    次に、次のようにmodule.exportsブロックを追加します。

    module.exports = function(passport, user) {
    
    }

    このブロック内で、パスポートローカル戦略と、引数として渡されるユーザーモデルを初期化します。これを行う方法は次のとおりです。

    module.exports = function(passport, user) {
    
        var User = user;
        var LocalStrategy = require('passport-local').Strategy;
    
    }

    次に、次のようにLocalStrategyのインスタンスを使用してカスタム戦略を定義します。

    passport.use('local-signup', new LocalStrategy(
    
        {
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true // allows us to pass back the entire request to the callback
    
        },
    
    ));

    これで、どのリクエストを宣言しました( req )usernameFieldとpasswordField(パスポート変数)のフィールド。

    最後の変数passReqToCallbackを使用すると、リクエスト全体をコールバックに渡すことができます。これは、サインアップに特に役立ちます。

    最後のコンマの後に、このコールバック関数を追加します。

      function(req, email, password, done) {
    
      }

    この関数では、ユーザーの詳細の保存を処理します。

    まず、コールバック関数内にハッシュ化されたパスワード生成関数を追加します。

     var generateHash = function(password) {
    
         return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
    
     };

    次に、以前にユーザーとして初期化したSequelizeユーザーモデルを使用します 、ユーザーがすでに存在するかどうかを確認し、存在しない場合は追加します。

    User.findOne({
        where: {
            email: email
        }
    }).then(function(user) {
    
        if (user)
    
        {
    
            return done(null, false, {
                message: 'That email is already taken'
            });
    
        } else
    
        {
    
            var userPassword = generateHash(password);
    
            var data =
    
                {
                    email: email,
    
                    password: userPassword,
    
                    firstname: req.body.firstname,
    
                    lastname: req.body.lastname
    
                };
    
    
            User.create(data).then(function(newUser, created) {
    
                if (!newUser) {
    
                    return done(null, false);
    
                }
    
                if (newUser) {
    
                    return done(null, newUser);
    
                }
    
            });
    
        }
    
    });

    User.create() データベースに新しいエントリを追加するためのSequelizeメソッドです。 データの値に注意してください オブジェクトはreq.bodyから取得されます サインアップフォームからの入力を含むオブジェクト。

    passport.js 次のようになります:

    //load bcrypt
    var bCrypt = require('bcrypt-nodejs');
    
    
    module.exports = function(passport, user) {
    
    
        var User = user;
    
        var LocalStrategy = require('passport-local').Strategy;
    
    
        passport.use('local-signup', new LocalStrategy(
    
            {
    
                usernameField: 'email',
    
                passwordField: 'password',
    
                passReqToCallback: true // allows us to pass back the entire request to the callback
    
            },
    
    
    
            function(req, email, password, done) {
    
                var generateHash = function(password) {
    
                    return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
    
                };
    
    
    
                User.findOne({
                    where: {
                        email: email
                    }
                }).then(function(user) {
    
                    if (user)
    
                    {
    
                        return done(null, false, {
                            message: 'That email is already taken'
                        });
    
                    } else
    
                    {
    
                        var userPassword = generateHash(password);
    
                        var data =
    
                            {
                                email: email,
    
                                password: userPassword,
    
                                firstname: req.body.firstname,
    
                                lastname: req.body.lastname
    
                            };
    
                        User.create(data).then(function(newUser, created) {
    
                            if (!newUser) {
    
                                return done(null, false);
    
                            }
    
                            if (newUser) {
    
                                return done(null, newUser);
    
                            }
    
                        });
    
                    }
    
                });
    
            }
    
        ));
    
    }

    次に、戦略をserver.jsにインポートします。

    これを行うには、server.js。にインポートされたルートの下にこれらの行を追加します。

    //load passport strategies
    require('./app/config/passport/passport.js')(passport, models.user);

    この時点で、server.jsは次のようになります。

    var express = require('express')
    var app = express()
    var passport = require('passport')
    var session = require('express-session')
    var bodyParser = require('body-parser')
    var env = require('dotenv').load()
    var exphbs = require('express-handlebars')
    
    
    //For BodyParser
    app.use(bodyParser.urlencoded({
        extended: true
    }));
    app.use(bodyParser.json());
    
    
    // For Passport
    app.use(session({
        secret: 'keyboard cat',
        resave: true,
        saveUninitialized: true
    })); // session secret
    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    
    
    //For Handlebars
    app.set('views', './app/views')
    app.engine('hbs', exphbs({
        extname: '.hbs'
    }));
    app.set('view engine', '.hbs');
    
    
    
    app.get('/', function(req, res) {
    
        res.send('Welcome to Passport with Sequelize');
    
    });
    
    //Models
    var models = require("./app/models");
    
    //Routes
    
    var authRoute = require('./app/routes/auth.js')(app);
    
    
    //load passport strategies
    
    require('./app/config/passport/passport.js')(passport, models.user);
    
    
    //Sync Database
    
    models.sequelize.sync().then(function() {
    
        console.log('Nice! Database looks fine')
    
    
    }).catch(function(err) {
    
        console.log(err, "Something went wrong with the Database Update!")
    
    });
    
    
    app.listen(5000, function(err) {
    
        if (!err)
    
            console.log("Site is live");
            
        else console.log(err)
    
    });

    次に、戦略を実際に / signupに適用します。 ルート。

    その方法は次のとおりです。

    まず、 app / routers / auth.jsに移動します 、このように登録するための投稿ルートを追加します。

    app.post('/signup', passport.authenticate('local-signup', {
            successRedirect: '/dashboard',
    
            failureRedirect: '/signup'
        }
    
    ));

    パスポートが必要なので、このメソッドに渡す必要があります。このスクリプトでパスポートをインポートするか、server.jsからパスポートを渡すことができます。後者をやってみましょう。

    このファイルにエクスポートされた関数を変更しますapp/ routings / auth.js パラメータとしてパスポートを使用します。 app / routers / auth.jsのコード 変更後は次のようになります。

    var authController = require('../controllers/authcontroller.js');
    
    
    module.exports = function(app, passport) {
    
        app.get('/signup', authController.signup);
    
    
        app.get('/signin', authController.signin);
    
    
        app.post('/signup', passport.authenticate('local-signup', {
                successRedirect: '/dashboard',
    
                failureRedirect: '/signup'
            }
    
        ));
    
    
    
    }

    次に、 server.js 、ルートのインポートを変更し、次のように引数としてパスポートを追加します:

    var authRoute = require('./app/routes/auth.js')(app,passport);

    次に、登録URL http:// localhost:5000 / signup /にアクセスして、登録してみます。

    サインアップしようとすると、「ユーザーをセッションにシリアル化できませんでした」というエラーが表示されます。 "。これは、パスポートがセッションにユーザーIDを保存する必要があり、これを使用して、必要に応じてユーザーの詳細を取得するための管理を行うためです。

    これを解決するために、パスポートのシリアル化機能と逆シリアル化機能の両方を app / config / passport / passport.jsに実装します。 ファイル。

    まず、シリアル化関数を追加します。この関数では、ユーザーIDを保存します セッションに。

    これを行うには、ローカル戦略の初期化の下に次の行を追加します。

    //serialize
    passport.serializeUser(function(user, done) {
    
        done(null, user.id);
    
    });

    次に、逆シリアル化機能を実装します。シリアル化関数のすぐ下に関数を追加します。

    // deserialize user 
    passport.deserializeUser(function(id, done) {
    
        User.findById(id).then(function(user) {
    
            if (user) {
    
                done(null, user.get());
    
            } else {
    
                done(user.errors, null);
    
            }
    
        });
    
    });

    上記の逆シリアル化関数では、Sequelize findByIdを使用します ユーザーを取得することを約束し、成功した場合は、Sequelizeモデルのインスタンスが返されます。このインスタンスからUserオブジェクトを取得するには、次のようなSequelizegetter関数を使用します。user.get()

    もう一度実行します:

    node server.js

    そして、サインアップしてみてください。 「CannotGET/dashboard」を手に入れたら万歳!これは、認証が成功したことを意味します。 routers / auth.jsのpassport.authenticateメソッドで/dashboardにリダイレクトしたことを思い出してください。 。

    それでは、先に進んでそのルートを追加しましょう。次に、ミドルウェアを追加して、ユーザーがセッションにログインしているときにのみページにアクセスできるようにします。

    app / views フォルダに、 dashboard.hbsという名前の新しいファイルを作成します 次のHTMLコードを追加します。

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>Passport with Sequelize</title>
    </head>
    
    <body>
        <h2>Dashboard</h2>
        <h5>Hurray! you are logged in.</h5>
    
    </body>
    
    </html>

    routers / auth.js 、この行を module.exports内に追加します ブロック:

    app.get('/dashboard',authController.dashboard);

    次に、 app / controllers / authController.jsに移動します ダッシュボードコントローラーを追加します。

    exports.dashboard = function(req, res) {
    
        res.render('dashboard');
    
    }

    AuthController.jsは次のようになります:

    var exports = module.exports = {}
    
    
    exports.signup = function(req, res) {
    
        res.render('signup');
    
    }
    
    exports.signin = function(req, res) {
    
        res.render('signin');
    
    }
    
    
    exports.dashboard = function(req, res) {
    
        res.render('dashboard');
    
    }

    ここで、アプリを再度実行し、以前に使用したものとは異なるメールアドレスでサインアップしてみてください。 / dashboardに適切にリダイレクトされます ルート。

    ただし、 / dashboard は保護されたルートではありません。つまり、ユーザーがログインしていなくても、それを見ることができます。これは必要ないため、 / logoutを追加します ルートを使用してユーザーをログアウトし、ルートを保護して、実行した内容をテストします。

    これをやってみましょう:

    routers / auth.js 次の行を追加します:

    app.get('/logout',authController.logout);

    次に、app / controllers/authController.jsにコントローラーを追加します。

     exports.logout = function(req, res) {
    
         req.session.destroy(function(err) {
    
             res.redirect('/');
    
         });
    
     }

    次に、アプリを再度実行して、別のメールアドレスで登録します。

    その後、http:// localhost:5000/logoutにアクセスしてユーザーをログアウトします。次に、http:// localhost:5000/dashboardにアクセスします。

    あなたはそれがかなりアクセス可能であることに気付くでしょう。そのルートを保護するためにカスタムミドルウェアを追加しましょう。

    これを行うには、 app / routers/auth.jsとを開きます。 この関数をmodule.exportsに追加します ブロック、他のすべてのコード行の下。

    function isLoggedIn(req, res, next) {
    
        if (req.isAuthenticated())
        
            return next();
            
        res.redirect('/signin');
    
    }

    次に、ダッシュボードルートハンドラーを次のように変更します。

    app.get('/dashboard',isLoggedIn, authController.dashboard);

    これで、アプリを再度実行してダッシュボードページにアクセスしようとしてログインしていない場合は、サインインページにリダイレクトされます。

    ふぅ!最後の部分であるサインインを実装する時が来ました。

    まず、 app / config / passport / passport.jsにサインインするための新しいローカル戦略を追加します。 。

    //LOCAL SIGNIN
    passport.use('local-signin', new LocalStrategy(
    
        {
    
            // by default, local strategy uses username and password, we will override with email
    
            usernameField: 'email',
    
            passwordField: 'password',
    
            passReqToCallback: true // allows us to pass back the entire request to the callback
    
        },
    
    
        function(req, email, password, done) {
    
            var User = user;
    
            var isValidPassword = function(userpass, password) {
    
                return bCrypt.compareSync(password, userpass);
    
            }
    
            User.findOne({
                where: {
                    email: email
                }
            }).then(function(user) {
    
                if (!user) {
    
                    return done(null, false, {
                        message: 'Email does not exist'
                    });
    
                }
    
                if (!isValidPassword(user.password, password)) {
    
                    return done(null, false, {
                        message: 'Incorrect password.'
                    });
    
                }
    
    
                var userinfo = user.get();
                return done(null, userinfo);
    
    
            }).catch(function(err) {
    
                console.log("Error:", err);
    
                return done(null, false, {
                    message: 'Something went wrong with your Signin'
                });
    
            });
    
    
        }
    
    ));

    この戦略では、 isValidPassword bcrypt でパスワードを保存したため、関数はbCrypt比較メソッドで入力されたパスワードを比較します

    詳細が正しければ、ユーザーはサインインします。

    次に、 routers / auth.jsに移動します 投稿するルートを/に追加します サインイン。

    app.post('/signin', passport.authenticate('local-signin', {
            successRedirect: '/dashboard',
    
            failureRedirect: '/signin'
        }
    
    ));

    完了すると、routes/auth.jsは次のようになります。

    var authController = require('../controllers/authcontroller.js');
    
    
    module.exports = function(app, passport) {
    
    
        app.get('/signup', authController.signup);
    
    
        app.get('/signin', authController.signin);
    
    
        app.post('/signup', passport.authenticate('local-signup', {
                successRedirect: '/dashboard',
    
                failureRedirect: '/signup'
            }
    
        ));
    
    
        app.get('/dashboard', isLoggedIn, authController.dashboard);
    
    
    
        app.get('/logout', authController.logout);
    
    
        app.post('/signin', passport.authenticate('local-signin', {
                successRedirect: '/dashboard',
    
                failureRedirect: '/signin'
            }
    
        ));
    
    
        function isLoggedIn(req, res, next) {
    
            if (req.isAuthenticated())
    
                return next();
    
            res.redirect('/signin');
    
        }
    
    }

    次に、アプリを実行してログインしてみます。ログイン時に使用した詳細情報を使用してログインできるようになると、 httpに移動します。 :// localhost:5000 /dashboard/。

    このチュートリアルの最後までおめでとうございます! MySQLデータベースでSequelizeとPassportを正常に使用しました。

    このチュートリアルの完全なコードはGitHubにあります。


    1. SQLとは何ですか?

    2. パラメータの配列を受け入れるOracleでストアドプロシージャを作成する方法

    3. OracleDatabaseでデータベースオブジェクトとしてVARRAYを作成する方法

    4. オンデマンドのPostgreSQL匿名化