3

複数のブラウザのウィンドウ/ページにsocket.ioidを使用しようとしています。これは、 everyauthを使用するSNS-auth-process用であり、プロジェクトはexpressに基づいています。

これが私のプロジェクトデザインです:

socket.io接続を維持する完全なajaxメインページ。リロード、リダイレクトなどはありません。

ユーザーがSNSアカウントを介してログインしようとすると、ポップアップウィンドウが開き、everyauthとSNSAuthによって管理されます。ポップアップウィンドウ内では、多くのリダイレクトが発生しますが、socket.io接続のように、メインウィンドウは永続的です。

最後に、認証が成功すると、everyauthはポップアップウィンドウで「authdone.html」をリダイレクトします。

ブラウザでは、このポップアップウィンドウは役に立たなくなったため、window.close();

ただし、everyauth全体で正常なログイン情報を取得できますが、私の場合は、socket.IOを介したセッション管理であるため、Expressフレームワークを使用したセッション管理は必ずしも必要ないため、Cookieの方が重要です

app.get('*',
    function (req, res)
    { 
        console.log("----------get------------");
        console.log(req.url);
        if (req.url == '/public/authdone.html')
        {
            console.log("----------get /public/authdone.html------------");
            console.log(req.cookies);  
            // express(connect) sessionID(sid) cookie available here.
            //{ 'connect.sid': '2DLlayNx90wtTsyeq5w83N9g.Kc1ZFd8I7omf6u4fk4FFyKAt4dP1V6IufSf1ZtRudVI' }
        }
        onreq(req, res);
    });

現在、ランディングページ(/public/authdone.html)にリダイレクトされたポップアップウィンドウでCookieを介してエクスプレスセッションIDを取得できましたが、これだけでは不十分です。また、ここのCookieでsocket.IO指向のIDを取得する必要があります。

実はここで戸惑い、質問をしました。 Socket.IOにCookie値を追加する

Wesのおかげで、次のように新しいCookie値(私の場合はソケットクライアントID)を追加する方法を少し見つけました。

io.configure(function ()
{
    io.set('authorization', function (handshake, callback)
    {
        if (handshake.headers.cookie)
        {
            var cookie = handshake.headers.cookie;
            var newS = ";" 
                + "socketClientID" + "=" 
                + "999999999999999";// eventually randomize for every client
            cookie += newS;
            console.log("=========================================");
            console.log(cookie);  
        } else
        {
            return callback('Cookie not found', false);
        }
        callback(null, true);
    });
});

このブロックでは、Cookieの値を「socketClientID=999999999999999」として追加します

したがって、console.logを介して出力される現在のCookieは次のようになります。

connect.sid=fc2iTJW3ETD7nIyxI5ZwpayK.S0qGhp1Ryw7Msg2r03yB6g822qVZIZTbZyWUSpQL0aU;
socketClientID=999999999999999

これまでのところ良いですが、everyauthリダイレクトページでは、まだ

----------get /public/authdone.html------------  
{ 'connect.sid': 'fc2iTJW3ETD7nIyxI5ZwpayK.S0qGhp1Ryw7Msg2r03yB6g822qVZIZTbZyWUSpQL0aU' }

エクスプレスsessionID(connect.sid)のみがCookieを介して取得でき、socket.IOハンドシェイクフェーズに追加されたclientIDcookie値は反映されません。

本当に助けが必要です。ありがとう。

4

1 に答える 1

1

OK、クライアント側からこの種の Cookie を構成する必要があることがわかりました。

io.sockets.on('connection', function (client)... から socketClientID を発行します。

または

Client から発行し、socketClientID をコールバックします。

クライアント Cookie の管理にはhttps://github.com/carhartl/jquery-cookieを使用 します。

于 2012-05-28T01:34:12.993 に答える