0

これには多くの踏み跡があることは知っていますが、探しているものが本当に見つかりませんでした。

したがって、ノードjsでユーザーをログインさせたいのですが、express、mongo dbを使用していますが、何よりもsocket.io. だから私は、私の index.html からカスタムフォームに記入してもらいたい:

app.get('/', function(req, res) {
  fs.readFile(__dirname + '/../index.html', 'utf8', function(err, text){
    res.send(text);
  });
});

<form method="get" id="lala" >
   <input type="text" name="user">
   <input type="text" name="user">
   <button id="button">KOKo</button>
</form>

ボタンクリック時:

socket.emit('checkLogin', { my collected data from the form });

サーバー側でこのユーザー名とパスワードを確認し、それらが問題ないかどうかを確認したいと思います (ここではどうすればよいかわかりませんが、php で作成しますSESSION['user_id'](たとえば)。その後、ユーザーが別の要求のために戻ってきたときに、私はこのセッションを確認でき、ユーザーがログインしていて、ページを表示できることがわかりました.passport.js mongo-db セッション ストアは見ましたが、デモを動作させることはできませんでした.できませんでした.セッションを保存する方法、セッションをチェックする方法、およびこの種のすべてのものを見つけました。

だから誰かが私を助けて、私のような馬鹿のためにデモを書き留めることができれば:

function check_auth_user(username,password,done,public_id){
  var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1";
  connection.query(sql, function (err,results) {
    if (err) throw err;

    if(results.length > 0){

      var res=results[0]; 
      passport.serializeUser(function(res, done) {
        done(null,res);
      });

      passport.deserializeUser(function(id, done) {
        done(null,res);
      });
      return done(null, res);
    } else {
      return done(null, false); 
    }
  });
}

しかし、どうすればセッションをストアに設定でき、その後どのようにセッションに到達することになっていますか? また、ソケットioから接続された正しいユーザーに送信する方法:-)

4

1 に答える 1

3

Passport がそのほとんどを処理します。

まず、方法を誤解serializeUserしていdeserializeUserます。グローバル ヘルパーを登録するには、アプリの初期化中に 1 回呼び出す必要があります。Passport はこれらを使用して、認証後にユーザー オブジェクトを user_id にシリアライズし、ユーザーが API にアクセスするたびにそれをユーザー オブジェクトにシリアライズします。

passport.serializeUser(function(res, done) {
  done(null, res.id);
});

passport.deserializeUser(function(id, done) {
  var sql="SELECT * FROM `table` WHERE id = '"+ id +"' limit 1";
  connection.query(sql, function (err, results) {
    done(err, results[0])
  });
});

したがって、check_auth_user機能は非常にシンプルになります。

function check_auth_user(username, password, done){
  var sql="SELECT * FROM `table` WHERE username = '"+ username +"' and password = '"+ password +"' limit 1";
  connection.query(sql, function (err, results) {
    done(err, results[0])
  });
}

passport.use(new LocalStrategy(check_auth_user));
app.post('/login', passport.authenticate('local', {
  failureRedirect: '/login',
  successRedirect: '/'
}));

Passport はuser_idExpress セッションに自動的に保存され、req.user完全にデシリアライズされたユーザーが入力されますが、express.sessionpassport.sessionミドルウェアの両方が有効になっていることを確認する必要があります。

app.use(express.session({
  secret: "very secret",
  store: new RedisStore() // or any other Store
}));
app.use(passport.session());

これで、次の方法でユーザー オブジェクトにアクセスできるようになりますreq.user

app.get('/hello', function (req, res) {
  if (req.user) {
    res.send('Hello, ' + req.user.username + ', your id is ' + req.user.id);
  } else {
    res.send('Hello anonymous');
  }
});
于 2013-10-25T08:08:35.717 に答える