2016-10-01 6 views
1

У меня есть серверное приложение NodeJS (Koa), которое отображает страницы с сервера, то есть nunjucks/jade/etc. Страница входа также отображается сервером. После входа в систему создаются файлы cookie.NodeJS: Каков наилучший способ обмена сеансом между обработанными сервером видами и React app

Теперь я создаю приложение для реагирования, которое будет встроено в защищенную страницу (после входа пользователя в систему). Каков наилучший способ заставить это приложение реагировать на безопасные запросы Http/Websocket на сервер, используя текущий сеанс пользователя?

В настоящее время я вставляю sessionId в тег сценария страницы, представленный сервером, где загружается приложение React. Так что ...

Сервер:

var session = require('koa-generic-session'); 
app.use(session({ 
    store: redisStore(...) 
})); 
app.use(function*(next) { 
    this.state.sessionIdFromServer = this.sessionId; 
    return yield next 
}); 

Клиент:

<script> 
var sessionId = {{sessionIdFromServer}}; 
</script> 
... 
<div id='app'> react app loads here </div> 

Затем я использую, что SESSIONID переменная в моей стороне клиента HTTP/WebSocket запросов (в частности, WebSocket).

Для каждого запроса, сделанного клиентом (передача sessionId в случае сокетов), сервер в основном проверяет хранилище сеансов Redis, чтобы убедиться, что этот сеанс по-прежнему действителен (то есть не истек или вышел из системы) перед выполнением запроса.

Является ли это целесообразным/безопасным?

ответ

0

Право, что я должен делать, это просто использовать файлы cookie для вашей сессии. Таким образом, любые вызовы AJAX на передней панели (включая WebSocket) будут использовать файл cookie в заголовках запросов.

С настройками HTTP Only, установленными в файле cookie, JavaScript с интерфейсом не может изменять (или доступ) к файлу cookie сеанса, но он по-прежнему используется браузером при любом исходящем запросе.

На мой взгляд, это самый безопасный способ использования идентификатора сеанса, без необходимости в первую очередь знать о существовании файла cookie.

Если сеанс в koa больше не существует, вы автоматически узнаете, что пользователь также вышел из системы.

Я сделал небольшой пример для этого (есть ссылка Github ниже):

Сначала index.js:

'use strict'; 

const session = require('koa-session'); 
const koa = require('koa'); 
const websockify = require('koa-websocket'); 
const route = require('koa-route'); 

const app = websockify(koa()); 

app.keys = ['some secret hurr']; 
const sessionStore = session(app); 

app.use(sessionStore); 
app.ws.use(sessionStore); 

app.use(route.all('/', function* (next) { 
    // ignore favicon 
    if (this.path === '/favicon.ico') return; 

    let n = this.session.views || 0; 
    this.session.views = ++n; 
    yield next; 
})); 

app.ws.use(route.all('/', function* (next) { 
    this.websocket.on('message', (message) => { 
    let n = this.session.views || 0; 
    this.session.views = ++n; 

    if (message === 'ping') { 
     // Return the amount of sessions (n) when the client sends ping 
     this.websocket.send('pong ' + n); 
    } 
    }); 

    yield next; 
})); 

app.use(require('koa-static')('./public')); 

app.listen(3000); 
console.log('listening on port 3000'); 

А потом index.html:

<html> 
    <script> 
    var ws = new WebSocket("ws://localhost:3000/"); 

    ws.onopen = function() { 
     // Sends a message 
     ws.send("ping"); 
    }; 

    ws.onmessage = function(e) { 
     // Receives a message. 
     alert(e.data); 
    }; 

    ws.onclose = function() { 
     alert("closed"); 
    }; 
    </script> 
</html> 

Я положил все это на рабочий экзамен e on GitHub.