[TIL]1210


Express.jsとMongoDBを使用したWebサービス2の作成


会員登録の実施-パスワードの保存-Hash


  • Hashは文字列を返すことができないように暗号化する方法

  • ->hash出力値でユーザーパスワードを認識できません

  • パスワードのハッシュ値をデータベースに保存します.

  • ハッシュログイン時に渡されたパスワードでログインを処理し、保存した値と比較する
  • SHA 1-使用方法

    const hash = crypto.createHash("sha1");
    hash.update(password);
    hash.digest("hex");
  • Node.jsの組み込みモジュールcryptoモジュールを使用してハッシュ値
  • を取得
  • は簡単なsha 1アルゴリズムを用いることもできるし、より強力なsha 224、sha 256などのアルゴリズムを用いることもできる.

    Passport.jsとは何ですか。

  • Express.
  • パッケージにより、jsアプリケーションのユーザー認証を容易に実現
  • ユーザセッション管理およびその他のログイン方式
  • passport-local

  • passportは、複数のログイン方式を実現するためのポリシーというインタフェースを提供します.
  • ポリシーインタフェースに対して多様な実装が設計されている(Facebook、Google、...)
  • passport-ユーザー名とパスワードを使用してローカルにログインするインプリメンテーション
  • ログイン機能の実装-passport-localポリシー

    const config = {
      usernameField: "email",
      passwordField: "password",
    };
    //  아이디 패스워드 필드 설정 필수!
    
    const local = new LocalStrategy(config, async (email, password, done) => {
      try {
        const user = await User.findOne({ email });
        if (!user) {
          throw new Error("회원을 찾을 수 없습니다.");
        }
        // user에 저장한 password는 hash 값이기 때문에 hash(pass)를 사용해야함
        if (user.password !== password) {
          throw new Error("비밀번호가 일치하지 않습니다.");
        }
    
        // 세션에 저장되는 유저 정보의 최소화
        done(null, {
          shortId: user.shortId,
          email: user.email,
          name: user.name,
        });
      } catch (err) {
        done(err, null);
      }
    });
  • passportポリシーの構成には、構成値と認証器
  • が使用されます.
  • passportポリシーでログイン処理を行う必要がある場合、どのデータ
  • が送信されるか

    ログイン機能-passportを実装します。jsの設定

    const local = require("./strategies/local");
    passport.use(local);
    passportは
  • が制定した戦略である.use
  • の使用を宣言する必要があります
  • passport.useを使用してポリシーを宣言した後
  • passport.authenticateポリシーを使用して要求
  • を処理できます.

    ログイン機能-passportを実装します。jsを使用してPOST要求を処理する

    // routes/auth.js
    router.post("/", passport.authenticate("local"));
    
    // app.js
    const session = require("express-session");
    app.use(
      session({
        secret: "secret",
        resave: false,
        saveUninitialized: true,
      })
    );
    app.use(passprot.initialize());
    app.use(passport.session());
    app.use("/auth", authRouter);

  • passport.authenticate関数をhttpルーティングに接続するとpassportは

  • 対応するポリシーを使用したリクエストハンドラの自動生成

  • express-ssessionとpassport.セッション()を使用してpassportにログインする場合

  • ユーザー情報をセッションに保存し、インポート操作を自動的に実行
  • ログイン機能の実装-セッションユーザーの使用

    passport.serializeUser((user, callback) => {
      callback(null, user);
    });
    
    passport.deserializeUser((obj, callback) => {
      callback(null, obj);
    });
  • セッションを使用する場合は、シーケンス化ユーザと逆シーケンス化ユーザを設定する必要があります:
  • は、セッションにおいてユーザ情報を変換記憶する機能
  • を提供する.
  • ex)メンバーidのみをセッションに保存し、使用時にデバイスでメンバー情報
  • を検索して使用する.
  • セッションを使用する場合、上記の2つの関数が作成されていない場合、passportログインは
  • に失敗します.

    ログアウト

    router.get('/logout', ... {
        req.logout();
        res.redirect('/');
    });
  • passportはreqです.logout関数
  • セッションのログイン情報を削除することにより、ログアウト機能
  • を実現することができる.

    ログイン検証ミドルウェア

    function loginRequired(req, res, next) {
      if (!req.user) {
        res.redirect("/");
        return;
      }
      next();
    }
    
    app.use("/posts", loginRequired, postsRouter);
  • ログインを必須に設定する場合は、ミドルウェアを使用してチェックできます.
  • Session Store


    セシオンとは?


  • Webサーバは,クライアント内の情報をクライアントごとに分割してサーバに格納する.

  • クライアント要求時にセッションIDを使用してクライアント情報を再チェックする技術

  • クライアントが情報を格納し、要求時に情報を送信するCookieとは逆
  • セッションの動作原理

  • サーバは、セッションIDをセッションの区切りとしてクライアント
  • に渡すセッションを作成する.
  • クライアントは、要求時にセッションIDをセット
  • を送信する.
  • サーバは、受信セッションIDを使用して対応するセッションを検索し、クライアント情報
  • を表示する.

    Express.jsのセッション

  • express-sessionパッケージを使用して、簡単なセッション操作
  • を実現します.
  • 特別な設定を必要とせずにセッション操作
  • を自動的に実行する.
  • ->セッションIDをクライアントに自動的に転送し、セッションIDを使用してクライアント情報
  • を検証する.

    セッション・ストレージの使用方法

  • express-sessionパッケージセッションをメモリにデフォルトで保存する
  • したがって、
  • は、現在実装アプリケーションを終了して再実行すると、すべてのユーザのログインが無効になる
  • .
  • または複数のサーバがサーバ間でセッション情報を共有できない
  • セッション・ストレージの構成


  • の左側で、Expressアプリケーションを作成するときにsessionを使用しない場合、sessionはExpressアプリケーションに含まれます.これは、Expressアプリケーションが終了すると、sessionも消滅することを意味します.
  • の右側のセッション・ストレージを使用している場合は、各Expressアプリケーションがセッション・ストレージに接続されているセッション・ストレージがあります.1つのセッションエラーは複数のExpressアプリケーションで共有されているため、Expressアプリケーションが終了してもセッションエラーは終了しないため、再度Expressアプリケーションをセッションエラーに貼り付けるとログイン情報やクライアント情報が失われず、再度確認できます.
  • セッションストレージとしてMongoDBを使用

  • connect-mongoパッケージでは、セッションストレージ
  • としてMongoDBを使用できます.
  • connect-mongoパッケージはexpress-sessionパッケージのオプションとして
  • を渡すことができる.
  • は、セッション値の変更時に自動的に更新し、セッションの呼び出し時に
  • を検索する.

    connect-mongo

    const MongoStore = require("connect-mongo");
    app.use(
      session({
        secret: "SeCrEt",
        resave: false,
        saveUninitialized: true,
        store: MongoStore.create({
          mongoUrl: "mongoUrl",
        }),
      })
    );
  • connect-mongoパッケージを使用してexpress-sessionを設定する場合は
  • です.
  • storeオプションに送信し、mongorlを
  • に設定します.
  • セッションデータ自動記憶と管理機能

    会員と投稿の関連付け-index

  • MongoDBは、検索のために文書を並べ替えて記憶する機能
  • を提供する.
  • Indexは、特定のクエリを効率的に実行することによって、パフォーマンスを向上させることができる
  • .
  • はまた、マルチキー、座標、テキストなどの特殊な値を含むインデックスを提供する.

    作成者への索引の設定

    author: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true,
        index: true,
    }

  • PostSchemaのauthorプロパティでindex:trueオプションを使用します.

  • mongoseは自動的にMongoDBにインデックスを作成します

  • インデックスを追加する時間が長くなると、MongoDBが応答できなくなる可能性があります.

  • ->インデックスの事前追加を推奨
  • CSRの実装方法

  • ページのロード時に必要なリソースをクライアントに宣言する
  • クライアント非同期呼び出しに必要なデータ
  • クライアントから送信データは加工され、リソースを使用して画面に表示する
  • .

    クライアントにリソースを宣言する-HTML Template

  • クライアントには、リソースを宣言する方法がいくつかあります.(React.js、Vue.jsなど)
  • HTML Templateブラウザに表示されないHTML Elementを作成する
  • 技術
  • 、JavaScriptを使用して画面上で繰り返し描画可能

    MongoDB Aggregation


    Aggregationとは?

  • MongoDB文書の加工と計算機能
  • RDBMSでSQLのような機能を使用できる
  • ex)SQLのGROUP BY、DISTINT、COUNT、JOINなど
  • 集約を使用する理由

  • MongoDBのfindは検索フィルタリングとソート以外の機能
  • を提供しない.
  • 他の収集からデータを取得するか、
  • .
  • で取得するデータパケットが必要な場合、
  • が必要となる.
    これは、
  • の重合によって達成することができる.
  • 集約の例

    db.posts.aggregate([
    { $group: { _id: '$author', count: { $sum: 1 } } },
    { $match: { sum: { $gt: 10}}},
    { $lookup: { from: 'users', localField: '_id', foreignField: '_id', as: 'users'} },
    ]);
  • の集約はステージからなり、各ステージは
  • を順次実行する.
  • 作者別投稿数
  • 10以上の投稿の作成者を見つけました.
  • 会員集中検索作者
  • Aggregation Reference

  • 重合の種類が多すぎて複雑で、全部暗記して使用する必要はありません.
  • MongoDBのホームページにはStageの説明とサンプルコードも整理されています.
  • https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#stages