我有一个php登录名,用户输入了用户名/密码,它根据登录信息检查mysql db。如果通过身份验证,则会通过php创建 session ,用户现在可以使用php session 访问系统。我的问题是,一旦他们通过php/session进行身份验证,将如何授权用户查看他们是否具有正确的登录权限以使用socket.io访问Node.js服务器?我不希望该人可以访问nodejs/socket.io函数/服务器,除非他们已通过php登录进行了身份验证。

最佳答案

更新

要求:

  • 首先运行redis。
  • 接下来启动socket.io。
  • 最后上传/托管PHP(在归档文件中具有依赖项)。

  • 套接字
    var express = require('express'),
            app         = express.createServer(),
            sio         = require('socket.io'),
            redis   = require("redis"),
        client  = redis.createClient(),
            io          = null;
    
    /**
     *  Used to parse cookie
     */
    function parse_cookies(_cookies) {
        var cookies = {};
    
        _cookies && _cookies.split(';').forEach(function( cookie ) {
            var parts = cookie.split('=');
            cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
        });
    
        return cookies;
    }
    
    app.listen(3000, "localhost");
    io = sio.listen(app);
    
    io.of('/private').authorization(function (handshakeData, callback) {
            var cookies = parse_cookies(handshakeData.headers.cookie);
    
            client.get(cookies.PHPSESSID, function (err, reply) {
                    handshakeData.identity = reply;
                    callback(false, reply !== null);
            });
    }).on('connection' , function (socket) {
            socket.emit('identity', socket.handshake.identity);
    });
    

    的PHP

    带有openid身份验证的php => http://dl.dropbox.com/u/314941/6503745/php.tar.gz

    登录后,您必须重新加载client.php进行身份验证

    p.s:我真的不喜欢创建另一个可能很不安全的密码的概念。我建议您看看openID(例如,通过Google),Facebook Connect(仅列出几个选项)。



    将唯一的session_id添加到允许的ID列表/集中,以便socket.io可以authorize(搜索授权功能)建立该连接。我会让PHP使用redis与node.js进行通信,因为那样会很快实现闪电般的速度/太好了:)。现在我正在从redis-cli伪造PHP通信

    安装Redis

    Download redis =>现在可以从以下位置下载稳定版本:http://redis.googlecode.com/files/redis-2.2.11.tar.gz
    alfred@alfred-laptop:~$ mkdir ~/6502031
    alfred@alfred-laptop:~/6502031$ cd ~/6502031/
    alfred@alfred-laptop:~/6502031$ tar xfz redis-2.2.11.tar.gz
    alfred@alfred-laptop:~/6502031$ cd redis-2.2.11/src
    alfred@alfred-laptop:~/6502031/redis-2.2.11/src$ make # wait couple of seconds
    

    启动Redis服务器
    alfred@alfred-laptop:~/6502031/redis-2.2.11/src$ ./redis-server
    

    套接字

    npm依赖

    如果尚未安装npm,则首先访问http://npmjs.org
    npm install express
    npm install socket.io
    npm install redis
    

    列出我已经安装的依赖项,根据npm ls,如果不兼容,您也应该安装这些依赖项
    alfred@alfred-laptop:~/node/socketio-demo$ npm ls
    /home/alfred/node/socketio-demo
    ├─┬ express@2.3.12
    │ ├── connect@1.5.1
    │ ├── mime@1.2.2
    │ └── qs@0.1.0
    ├── hiredis@0.1.12
    ├── redis@0.6.0
    └─┬ socket.io@0.7.2
      ├── policyfile@0.0.3
      └── socket.io-client@0.7.2
    

    Code

    server.js
    var express = require('express'),
            app         = express.createServer(),
            sio         = require('socket.io'),
            redis   = require("redis"),
        client  = redis.createClient(),
            io          = null;
    
    /**
     *  Used to parse cookie
     */
    function parse_cookies(_cookies) {
        var cookies = {};
    
        _cookies && _cookies.split(';').forEach(function( cookie ) {
            var parts = cookie.split('=');
            cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
        });
    
        return cookies;
    }
    
    app.listen(3000, "localhost");
    io = sio.listen(app);
    
    io.configure(function () {
      function auth (data, fn) {
        var cookies = parse_cookies(data.headers.cookie);
        console.log('PHPSESSID: ' + cookies.PHPSESSID);
    
            client.sismember('sid', cookies.PHPSESSID, function (err , reply) {
                fn(null, reply);
            });
      };
    
      io.set('authorization', auth);
    });
    
    io.sockets.on('connection', function (socket) {
      socket.emit('access', 'granted');
    });
    

    要运行服务器,只需运行node server.js
    client.php
    <?php
    
    session_start();
    
    echo "<h1>SID: " . session_id() . "</h1>";
    ?>
    <html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
        <script src="http://localhost:3000/socket.io/socket.io.js"></script>
    </head>
    <body>
        <p id="text">access denied</p>
        <script>
            var socket = io.connect('http://localhost:3000/');
            socket.on('access', function (data) {
                $("#text").html(data);
            });
        </script>
    </body>
    

    测试认证

    当您从Web浏览器加载网页(PHP文件)时,将显示access denied消息,但是当您添加浏览器中也显示的session_id到redis服务器时,将显示access granted消息。当然,通常您不会进行任何复制粘贴,而只是让PHP直接与Redis进行通信。但是对于此演示,您将把SID ramom807vt1io3sqvmc8m4via1放入redis中,然后再授予访问权限。
    alfred@alfred-laptop:~/database/redis-2.2.0-rc4/src$ ./redis-cli
    redis> sadd sid ramom807vt1io3sqvmc8m4via1
    (integer) 1
    redis>
    

    关于php - 验证用户的socket.io/nodejs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6502031/

    10-09 20:14
    查看更多