Обновление
Требования:
- Сначала включите redis.
- Затем запустите socket.io.
- Наконец загрузите / хост 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
php с аутентификацией openid => http://dl.dropbox.com/u/314941/6503745/php.tar.gz
После входа в систему вы должны перезагрузить client.php
для аутентификации
ps: мне действительно не нравится идея создания еще одного пароля, который, вероятно, будет небезопасным.Я бы посоветовал вам взглянуть на openID (например, через Google ), Facebook Connect (просто назовите несколько вариантов).
Мой вопрос: как только они проходят аутентификацию через php / session, каков будет процесс аутентификации пользователя, чтобы увидеть, имеют ли они права на вход в систему для доступа к серверу nodejs с socket.io?Я не хочу, чтобы человек имел доступ к функции / серверу nodejs / socket.io, если он не прошел аутентификацию через логин php.
Добавьте уникальный session_id в список /набор разрешенных идентификаторов, чтобы socket.io мог авторизовать (поиск функции авторизации) этого соединения.Я бы позволил PHP общаться с node.js, используя redis , потому что это будет молниеносно / AWESOME :).Прямо сейчас я подделываю сообщение PHP от redis-cli
Установить Redis
Скачать 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
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
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
<?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>
Проверка подлинности
При загрузке веб-страницы (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>