├── .gitignore ├── .travis.yml ├── README.md ├── example.js ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | - "6" 5 | - "5" 6 | - "4" 7 | cache: 8 | directories: 9 | - node_modules 10 | notifications: 11 | email: false 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-laravel-session 2 | a way to share laravel session with node. please feel free to make PR's with additional functionality such as getting decoded sessions from other session drivers 3 | 4 | # What it does 5 | This is a simple utility which helps you obtain the laravel session key. You pass in your laravel key, as well as your laravel_session found in your cookie and we return a key that helps you find the session details. 6 | 7 | # API 8 | ``` 9 | getAppKey(pathToEnvFile): resolves APP_KEY found in .env without 'base64:' 10 | 11 | getSessionKey(laravel_session, laravelAppKey, [optional keyLength]): returns laravel session key such as 'ffdbeaac243c2d691d64084710d428d575c07007' 12 | 13 | getSessionFromRedis(laravelSessionKey, redisConnection, [optional sessionPrefix='laravel_cache']): returns a promise that resolves with the session object. On laravel 5.4 or less, the sessionPrefix should be 'laravel' 14 | 15 | getSessionFromMysql(laravelSessionKey, mySqlConnection [, databaseTable]): returns a promise that resolves with the session object 16 | 17 | getSessionFromFile(laravelSessionKey, sessionFilePath): returns a promise that resolves with session object 18 | ``` 19 | 20 | # Usage 21 | 22 | `let laravelSession = require('node-laravel-session');` 23 | 24 | 25 | 26 | Get your laravel_session from the cookie. for example: 27 | 28 | ``` js 29 | let cookie = require('cookie'); 30 | let session = cookie.parse(req.headers.cookie).laravel_session; 31 | ``` 32 | 33 | Get your app key, for example "MES4V4nAY+eLns059EwEXaXbCB2YKLHCP6bA7tc54KI=" by pasting it or by parsing the laravel .env file with a regex to obtain it. DO NOT INCLUDE "Base64:". or use the provided function function. 34 | 35 | ``` js 36 | laravelSession.getAppKey('path/to/your/.env') 37 | .then((appKey) => { 38 | // continue 39 | }); 40 | ``` 41 | 42 | Then just find the key by calling the function 'getSessionKey' 43 | 44 | ``` js 45 | let sessionKey = laravelSession.getSessionKey(session, appKey); 46 | ``` 47 | 48 | Get your complete laravel session. Redis example 49 | 50 | ``` js 51 | laravelSession.getSessionFromMysql(sessionKey, mySqlConnection) 52 | .then((session) => { 53 | console.log('here is the full session:' + session); 54 | }); 55 | ``` 56 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | // require node server., and cookie parser 3 | const http = require('http'); 4 | const cookie = require('cookie'); 5 | 6 | // require node-laravel-session library 7 | const laravelSession = require('node-laravel-session'); 8 | 9 | // connect to redis because that is where sessions are stored - this can be mysql, or redis 10 | let redis = require('redis'); 11 | let redisCon = redis.createClient(); 12 | 13 | //Lets define a port we want to listen to 14 | const PORT = 8080; 15 | 16 | // path to laravel environment filepath 17 | const ENV_PATH = 'C:/wamp64/www/socialMedia/.env'; 18 | 19 | // this is the function that will respond all request to this node server - note: we have not created the server yet 20 | function handleRequest(request, response){ 21 | 22 | //getting laravel app key 23 | laravelSession.getAppKey(ENV_PATH) 24 | .then((appKey) => { 25 | 26 | //once we have the appKey, lets parse the cookie 27 | let session = cookie.parse(request.headers.cookie); 28 | 29 | //get the session id 30 | let sessionId = laravelSession.getSessionKey(session.laravel_session, appKey); 31 | 32 | // get the session from redis 33 | laravelSession.getSessionFromRedis(sessionId, redisCon).then((session) => { 34 | //now we have the session available here 35 | response.end(JSON.stringify(session)); 36 | }); 37 | 38 | }); 39 | 40 | } 41 | 42 | 43 | //Create a server which will handle all request using the handleRequest method 44 | var server = http.createServer(handleRequest); 45 | 46 | // redis error handling, not needed for this demo but its here 47 | redisCon.on("error", function (err) { 48 | console.log("Error " + err); 49 | }); 50 | 51 | // once redis connects it will make the server start listening 52 | redisCon.on("ready", function (err) { 53 | //Lets start our server 54 | server.listen(PORT, function(){ 55 | //Callback triggered when server is successfully listening. Hurray! 56 | console.log("Server listening on: http://localhost:%s", PORT); 57 | }); 58 | }); 59 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const unserialize = require('php-unserialize').unserialize; 4 | const unserialize2 = require('php-serialization').unserialize; 5 | const crypto = require('crypto'); 6 | const fs = require('fs'); 7 | 8 | module.exports = { 9 | getAppKey: function (filepath) { 10 | return new Promise(function (resolve, reject) { 11 | fs.readFile(filepath, 'utf8', function (err, data) { 12 | if (err != null) return reject(err); 13 | 14 | let key = data.match(/APP_KEY.*/g); 15 | 16 | if (key.length == 0) return reject('APP_KEY not found'); 17 | key = key[0]; 18 | key = key.split('=')[1].trim(); 19 | 20 | return resolve(key.replace('base64:', '')); 21 | }); 22 | }); 23 | }, 24 | getSessionKey: function (laravelSession, laravelKey, keyLength) { 25 | keyLength = keyLength || 32; 26 | let cypher = 'aes-' + keyLength * 8 + '-cbc'; 27 | 28 | //Get session object 29 | laravelSession = new Buffer(laravelSession, 'base64'); 30 | laravelSession = laravelSession.toString(); 31 | laravelSession = JSON.parse(laravelSession); 32 | 33 | //Create key buffer 34 | laravelKey = new Buffer(laravelKey, 'base64'); 35 | 36 | //crypto required iv in binary or buffer 37 | laravelSession.iv = new Buffer(laravelSession.iv, 'base64'); 38 | 39 | //create decoder 40 | let decoder = crypto.createDecipheriv(cypher, laravelKey, laravelSession.iv); 41 | 42 | //add data to decoder and return decoded 43 | let decoded = decoder.update(laravelSession.value, 'base64'); 44 | 45 | //unserialize 46 | return unserialize(decoded); 47 | }, 48 | getSessionFromFile: function (laravelSessionKey, filePath) { 49 | return new Promise(function (resolve, reject) { 50 | fs.readFile(filePath + '/' + laravelSessionKey, 'utf8', function (err, data) { 51 | if (err != null) return reject(err); 52 | 53 | return resolve(unserialize2(data)); 54 | }); 55 | }); 56 | }, 57 | getSessionFromRedis: function (laravelSessionKey, redisConnection, sessionPrefix='laravel_cache') { 58 | return new Promise(function (resolve, reject) { 59 | redisConnection.get(sessionPrefix + ':' + laravelSessionKey, function (err, value) { 60 | if (err != null) return reject(err); 61 | 62 | return resolve(unserialize2(unserialize2(value))); 63 | }); 64 | }); 65 | }, 66 | getSessionFromMysql: function (laravelSessionKey, mySqlConnection, databaseTable) { 67 | return new Promise(function (resolve, reject) { 68 | databaseTable = databaseTable || 'sessions'; 69 | 70 | mySqlConnection.query('select payload from ' + databaseTable + ' where id = "' + laravelSessionKey + '"', function (err, rows, fields) { 71 | if (err != null) return reject(err); 72 | if (rows.length == 0) return reject('Session not found'); 73 | let session = new Buffer(rows[0].payload, 'base64').toString(); 74 | 75 | return resolve(unserialize(session)); 76 | }); 77 | }); 78 | }, 79 | getUserIdFromSession: function (session) { 80 | var cookieKey = 'login_82e5d2c56bdd0811318f0cf078b78bfc'; 81 | if (session.hasOwnProperty(cookieKey)) { 82 | return session[cookieKey]; 83 | } 84 | for (var key in session) { 85 | var matches = key.match(/login_(.*_)?([a-zA-Z0-9]+)/gi); 86 | if (matches && matches.length > 0) { 87 | return session[matches[0]]; 88 | } 89 | } 90 | } 91 | }; 92 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-laravel-session", 3 | "version": "2.0.1", 4 | "description": "Tool in order to share sessions between node and laravel", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "laravel", 11 | "node", 12 | "session", 13 | "authentication", 14 | "socket", 15 | "redis", 16 | "share" 17 | ], 18 | "author": "Ricardo Spear", 19 | "license": "MIT", 20 | "repository": { 21 | "type": "git", 22 | "url": "git://github.com/spearmootz/node-laravel-session.git" 23 | }, 24 | "dependencies": { 25 | "php-serialization": "0.0.4", 26 | "php-unserialize": "0.0.1" 27 | } 28 | } 29 | --------------------------------------------------------------------------------