gpt4 book ai didi

php - 验证 socket.io/nodejs 的用户

转载 作者:IT老高 更新时间:2023-10-28 21:55:04 24 4
gpt4 key购买 nike

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

最佳答案

更新

要求:

  1. 首先运行 redis。
  2. 接下来启动 socket.io。
  3. 终于上传/托管 PHP(存档中有依赖项)。

Socket.io

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 (仅列举几个选项)。

My question is once they authenticate via php/session what would be the process to authenticate the user to see if they have the right login permissions to access a nodejs server with socket.io? I dont want the person to have access to the nodejs/socket.io function/server unless they have authenticated via the php login.

添加唯一的 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-server

alfred@alfred-laptop:~/6502031/redis-2.2.11/src$ ./redis-server 

Socket.io

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 服务器将显示消息访问权限。当然,通常你不会做任何复制粘贴,而只是让 PHP 直接与 Redis 通信。 auth .但是对于这个演示,您将把 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com