quorrajs/NodeSession

View on GitHub
README.md

Summary

Maintainability
Test Coverage
NodeSession
===========

Since HTTP driven applications are stateless, sessions provide a way to store information about the user across requests.
NodeSession ships with a variety of session back-ends available for use through a clean, unified API. Support for
back-ends such as File and databases is included out of the box.

[![npm version](https://badge.fury.io/js/node-session.svg)](http://badge.fury.io/js/node-session)
[![Build Status](https://travis-ci.org/quorrajs/NodeSession.svg?branch=master)](https://travis-ci.org/quorrajs/NodeSession)
[![Quality](https://codeclimate.com/github/quorrajs/NodeSession/badges/gpa.svg)](https://codeclimate.com/github/quorrajs/NodeSession)

- [Installation](#installation)
- [Session Usage](#session-usage)
- [Configuration](#configuration)
- [Flash Data](#flash-data)
- [CSRF Token](#csrf-token)
- [Database Sessions](#database-sessions)
- [Session Drivers](#session-drivers)

## Installation

The source is available for download from [GitHub](https://github.com/quorrajs/NodeSession). Alternatively, you
can install using Node Package Manager (npm):

```javascript
npm install node-session
```
## Session Usage

**Initialization**

```javascript
var NodeSession = require('node-session');

// init
session = new NodeSession({secret: 'Q3UBzdH9GEfiRCTKbi5MTPyChpzXLsTD'});

// start session for an http request - response
// this will define a session property to the request object
session.startSession(req, res, callback)

```

**Accessing sessions**

The session can be accessed via the HTTP request's session property.

**Storing An Item In The Session**

```javascript
req.session.put('key', 'value');
```

**Push A Value Onto An Array Session Value**

```javascript
req.session.push('user.teams', 'developers');
```

**Retrieving An Item From The Session**

```javascript
var value = req.session.get('key');
```

**Retrieving An Item Or Returning A Default Value**

```javascript
var value = req.session.get('key', 'default');
```

**Retrieving An Item And Forgetting It**

```javascript
var value = req.session.pull('key', 'default');
```

**Retrieving All Data From The Session**

```javascript
var data = req.session.all();
```

**Determining If An Item Exists In The Session**

```javascript
if (req.session.has('users'))
{
    //
}
```

**Removing An Item From The Session**

```javascript
req.session.forget('key');
```

**Removing All Items From The Session**

```javascript
req.session.flush();
```

**Regenerating The Session ID**

```javascript
req.session.regenerate();
```


## Flash Data

Sometimes you may wish to store items in the session only for the next request. You may do so using the
`req.session.flash` method:

```javascript
req.session.flash('key', 'value');
```

**Reflashing The Current Flash Data For Another Request**

```javascript
req.session.reflash();
```

**Reflashing Only A Subset Of Flash Data**

```javascript
req.session.keep('username', 'email');
```


## CSRF Token

By default NodeSession generates and keeps CSRF token for your application in session.
 
**Access CSRF token**

```javascript
req.session.getToken()
```

**Regenerate CSRF token**

```javascript
req.session.regenerateToken()
```


## configuration

Configuration options are passed during initialization of NodeSession module as an object. NodeSession supports following configuration
options.

```javascript
{
    /*
    |--------------------------------------------------------------------------
    | Encryption secret
    |--------------------------------------------------------------------------
    |
    | This secret key is used by the NodeSession to encrypt session and sign cookies
    | etc. This should be set to a random, 32 character string, otherwise these
    | encrypted strings will not be safe.
    |
    */

    'secret': 'Q3UBzdH9GEfiRCTKbi5MTPyChpzXLsTD'

    /*
     |--------------------------------------------------------------------------
     | Default Session Driver
     |--------------------------------------------------------------------------
     |
     | This option controls the default session "driver" that will be used on
     | requests. By default, NodeSession will use the lightweight file driver but
     | you may specify any of the other wonderful drivers provided here.
     |
     | Supported: "memory", "file", "database"
     |
     */

    'driver': 'file',

    /*
     |--------------------------------------------------------------------------
     | Session Lifetime
     |--------------------------------------------------------------------------
     |
     | Here you may specify the number of milli seconds that you wish the session
     | to be allowed to remain idle before it expires. If you want them
     | to immediately expire on the browser closing, set that option.
     |
     | Default lifetime value: 300000
     | Default expireOnClose value: false
     |
     */

    'lifetime': 300000, // 5 minutes

    'expireOnClose': false,



    /*
     |--------------------------------------------------------------------------
     | Session File Location
     |--------------------------------------------------------------------------
     |
     | When using the file session driver, we need a location where session
     | files may be stored. By default NodeSession will use the location shown here
     | but a different location may be specified. This is only needed for
     | file sessions.
     |
     */

    'files': process.cwd() + '/sessions',

    /*
     |--------------------------------------------------------------------------
     | Session Database Connection
     |--------------------------------------------------------------------------
     |
     | When using the "database" session driver, you may specify a connection that
     | should be used to manage these sessions.
     |
     | NodeSession uses Nodejs Waterline module for database interactions, hence
     | it supports all databases supported by waterline. Before you specify a
     | waterline adapter with your connection make sure that you have installed
     | it in your application.
     |
     | For example before using sail-mong adapter
     | Run:
     | npm install sails-mongo
     |
     */

    'connection': {
        'adapter': 'sails-mongo',
        'host': 'localhost',
        'port': 27017,
        'user': 'tron',
        'password': '',
        'database': 'tron'
    },

    /*
     |--------------------------------------------------------------------------
     | Session Database Table
     |--------------------------------------------------------------------------
     |
     | When using the "database" session driver, you may specify the table we
     | should use to manage the sessions. Of course, NodeSession uses `sessions`
     | by default; however, you are free to change this as needed.
     |
     */

    'table': 'sessions',

    /*
     |--------------------------------------------------------------------------
     | Session Sweeping Lottery
     |--------------------------------------------------------------------------
     |
     | Some session drivers must manually sweep their storage location to get
     | rid of old sessions from storage. Here are the chances that it will
     | happen on a given request. By default, the odds are 2 out of 100.
     |
     */

    'lottery': [2, 100],

    /*
     |--------------------------------------------------------------------------
     | Session Cookie Name
     |--------------------------------------------------------------------------
     |
     | Here you may change the name of the cookie used to identify a session
     | instance by ID. The name specified here will get used every time a
     | new session cookie is created by the NodeSession for every driver.
     |
     | default: 'node_session'
     |
     */

    'cookie': 'node_session',

    /*
     |--------------------------------------------------------------------------
     | Session Cookie Path
     |--------------------------------------------------------------------------
     |
     | The session cookie path determines the path for which the cookie will
     | be regarded as available. Typically, this will be the root path of
     | your application but you are free to change this when necessary.
     |
     | default: '/'
     |
     */

    'path': '/',

    /*
     |--------------------------------------------------------------------------
     | Session Cookie Domain
     |--------------------------------------------------------------------------
     |
     | Here you may change the domain of the cookie used to identify a session
     | in your application. This will determine which domains the cookie is
     | available to in your application.
     |
     | default: null
     |
     */

    'domain': null,

    /*
     |--------------------------------------------------------------------------
     | HTTPS Only Cookies
     |--------------------------------------------------------------------------
     |
     | By setting this option to true, session cookies will only be sent back
     | to the server if the browser has a HTTPS connection. This will keep
     | the cookie from being sent to you if it can not be done securely.
     |
     | default: false
     |
     */

    'secure': false

    /**
    |-----------------------------------------------------------------------------
    | Encrypt session
    |-----------------------------------------------------------------------------
    |
    | If you need all stored session data to be encrypted, set the encrypt
    | configuration option to true.
    |
    | default: false
    |
    */

    'encrypt': false
}
```

The NodeSession uses the flash session key internally, so you should not add an item to the session by that name.


## Database Sessions

When using the database session driver, you may need to setup a table to contain the session items based on database.
Below is a required schema for the table:

| filed        | type    | index  |
|--------------|---------|--------|
| id           | string  | unique |
| payload      | string  |        |
| lastActivity | integer |        |


## Session Drivers

The session "driver" defines where session data will be stored for each request. NodeSession ships with several great
drivers out of the box:

- memory - sessions will be stored in memory. Memory session driver is purposely not designed for a production
environment. It will leak memory under most conditions, does not scale past a single process, and is meant for
debugging and developing.
- file - sessions will be stored in files in a specified location.
- database - sessions will be stored in a database.

## To do

- Add redis session driver

## License

The NodeSession is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT).