web-dev-qa-db-ja.com

Node.jsとMEANスタックで認証を行う方法は?

私は現在、開発者の小さなチームとテキストベースのゲームに取り組んでいます。ゲームにはログインが必要であり、アプリケーションコードベースにMEAN(MongoDB、Express、Angular、Node)スタックを使用していますが、Rails開発者として慣れているため、認証に行き詰まっています宝石をドロップして、利用可能なヘルパーを使用できます。

誰かがMEANと認証の経験がありますか?

17
user2693845

linnovateによるMEANスタックは、認証に Passport.js を使用します。 Passportは、認証にさまざまな方法を使用します。これらの戦略の1つは、ユーザー名とパスワードのペアで、LocalStrategyと呼ばれます。

以下は、Passportjs-Local Githubのサンプルの1つです Examples Page

ステップ1:パスポートが必要

Npm install passportを実行した後、最初にモジュールが必要です

var passport = require('passport');

ステップ2:「確認」機能を設定する

Passport内のLocalStrategyを使用します。パスポートの戦略には、verify関数が必要です。この関数は、資格情報(この場合はユーザー名とパスワード)を受け入れ、ユーザーオブジェクトを使用してコールバックを呼び出します。現実の世界では、これはデータベースを照会します。ただし、この例では、組み込みユーザーのセットを使用しています。

passport.use(new LocalStrategy(
  function(username, password, done) {

  // Find the user by username.  If there is no user with the given
  // username, or the password is not correct, set the user to `false` to
  // indicate failure and set a flash message.  Otherwise, return the
  // authenticated `user`.

  findByUsername(username, function(err, user) {
      if (err) { return done(err); }
      if (!user) { 
          return done(null, false, { message: 'Unknown user ' + username }); 
      }
      if (user.password != password) { 
          return done(null, false, { message: 'Invalid password' }); 
      }
        return done(null, user);
      })
    });
  }
));

ステップ3:アプリでパスポートを初期化する

パスポートを使用し、セッションを管理することをExpressに伝える必要があります。これは、アプリの構成時にapp.use()を使用して行われます。

app.use(passport.initialize());
app.use(passport.session());

ステップ4:ログインURIでミドルウェアを構成する

次に、ユーザーが特定のURIにPOSTして、アプリにログインしようとしたときに受け入れるメソッドを作成する必要があります。こんな感じになります。

// POST /login
//   Use passport.authenticate() as route middleware to authenticate the
//   request.  If authentication fails, the user will be redirected back to the
//   login page.  Otherwise, the primary route function function will be called,
//   which, in this example, will redirect the user to the home page.
//
//   curl -v -d "username=bob&password=secret" http://127.0.0.1:3000/login
app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
  function(req, res) {
    res.redirect('/');
  });

ステップ5:セッションのセットアップセッションに格納されているユーザーオブジェクトに対して、独自のシリアル化を作成する必要がある場合があります。それは次のように行われます

// Passport session setup.
//   To support persistent login sessions, Passport needs to be able to
//   serialize users into and deserialize users out of the session.  Typically,
//   this will be as simple as storing the user ID when serializing, and finding
//   the user by ID when deserializing.
passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  findById(id, function (err, user) {
    done(err, user);
  });
});
33
jpotts18

http://meanjs.org/ をご覧ください。passport.js戦略が非常に強固に統合されています。特に統合を安全にするために、SaltとCrypto-Techniesを実装すると便利です。リポジトリ内でSalzを検索します。

https://github.com/meanjs/mean/blob/master/modules/users/server/config/strategies/local.js を参照してください。シリアライゼーションとデシリアライゼーションについて。

2
Rentrop

または、カスタム実装を希望する場合は、最近完全な MEAN Stackユーザー登録とログインの例 を投稿しました

以下は、認証を処理するユーザーサービスのスニペットです。

function authenticate(username, password) {
    var deferred = Q.defer();

    usersDb.findOne({ username: username }, function (err, user) {
        if (err) deferred.reject(err);

        if (user && bcrypt.compareSync(password, user.hash)) {
            // authentication successful
            deferred.resolve(jwt.sign({ sub: user._id }, config.secret));
        } else {
            // authentication failed
            deferred.resolve();
        }
    });

    return deferred.promise;
}
1
Jason