3

Expressサーバーにun/pwでクエリを実行し、認証してから、アカウント情報(MongoDBから)を新しいセッションIDとともにクライアントに送信するBackboneアプリがあります。さらにデータが必要な場合は、セッションIDを.fetch()オプションに付加します。ただし、セッションがRedisに正常に保存されていても、Expressは新しいセッションを作成します。

これは、クライアントが私のAPIを使用しようとしているかどうかをチェックするミドルウェアです

var _restrictApi = function(req, res, next) {
  if (req.url.match(/api/)) {
    res.xhrAuthValid = req.param('sessionId') == req.sessionID;
    if (res.xhrAuthValid || (req.method=='GET' && req.url.match(/api\/account/))) {
      console.log('API access granted', req.url);
      console.dir(req.session);
      next();
    } else {
      console.log('API access BLOCKED', req.url);
      console.log(req.param('sessionId'), req.sessionID);
      console.dir(req.session);
      res.send(403, 'Forbidden');
    }
  } else {
    next();
  }
};

私のバックボーンアプリは、ロード時にいくつかの.fetch()呼び出しを行います。最初にログインしてから、ユーザーのイベントを取得します。Expressサーバーのコンソールログは次のとおりです。

API access granted /api/account?email=test%40gmail.com&password=somepw
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }
_checkAccount test@gmail.com
pw matches
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  account: 
   { _id: 500471eb8bfff124ce984917,
     dtAdd: '2012-07-16T20:07:58.671Z',
     email: 'test@gmail.com',
     pwHash: '$2a$10$2KJXrZeAGW58Kp9JQDL9B.K2Fvu2oE3oqWKRl55o8MeXGHA/zCBE.',
     sessionId: 'iqYjOA7CeQHny9cm8zOWERjv' } }
API access BLOCKED /api/events?accountId=500471eb8bfff124ce984917&sessionId=iqYjOA7CeQHny9cm8zOWERjv
iqYjOA7CeQHny9cm8zOWERjv rsSXKtzXNNiq8x3+pUN9JXWF
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }
4

1 に答える 1

1

sessionIDに署名してconnect.sidを作成します。

cookie = require('cookie-signature')
res.send('connect.sid=s%3A'+cookie.sign(req.sessionID, req.secret))

ローカルストレージに保存し、AJAXリクエストごとにCookieヘッダーを設定します。

r.setRequestHeader('Cookie', window.localStorage['connect.sid'])

それはうまくいきます。

于 2012-10-23T19:36:13.107 に答える