Research
Security News
Threat Actor Exposes Playbook for Exploiting npm to Build Blockchain-Powered Botnets
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
@fastify/session
Advanced tools
A session plugin for fastify. Requires the @fastify/cookie plugin.
NOTE: This is the continuation of fastify-session which is unmaintained by now. All work credit till e201f7
commit goes to SerayaEryn and contributors.
npm i @fastify/session
const fastify = require('fastify');
const fastifySession = require('@fastify/session');
const fastifyCookie = require('@fastify/cookie');
const app = fastify();
app.register(fastifyCookie);
app.register(fastifySession, {secret: 'a secret with minimum length of 32 characters'});
Store data in the session by adding it to the session
decorator at the request
:
app.register(fastifySession, {secret: 'a secret with minimum length of 32 characters'});
app.addHook('preHandler', (request, reply, next) => {
request.session.user = {name: 'max'};
next();
})
NOTE: For all unencrypted (HTTP) connections, you need to set the secure
cookie option to false
. See below for all cookie options and their details.
The session
object has methods that allow you to get, save, reload and delete sessions.
app.register(fastifySession, {secret: 'a secret with minimum length of 32 characters'});
app.addHook('preHandler', (request, reply, next) => {
request.session.destroy(next);
})
The session plugin accepts the following options. It decorates the request with the sessionStore
and a session
object. The session data is stored server-side using the configured session store.
The secret used to sign the cookie. Must be an array of strings or a string with a length of 32 or greater or a custom signer.
If an array, the first secret is used to sign new cookies and is the first to be checked for incoming cookies. Further secrets in the array are used to check incoming cookies in the order specified.
For a custom signer see the documentation of @fastify/cookie
Note that the rest of the application may manipulate the array during its life cycle. This can be done by storing the array in a separate variable that is later used with mutating methods like unshift(), pop(), splice(), etc. This can be used to rotate the signing secret at regular intervals. A secret should remain somewhere in the array as long as there are active sessions with cookies signed by it. Secrets management is left up to the rest of the application.
The name of the session cookie. Defaults to sessionId
.
Prefix for the value of the cookie. This is useful for compatibility with express-session
, which prefixes all cookies with "s:"
. Defaults to ""
.
The options object is used to generate the Set-Cookie
header of the session cookie. May have the following properties:
path
- The Path
attribute. Defaults to /
(the root path).maxAge
- A number
in milliseconds that specifies the Expires
attribute by adding the specified milliseconds to the current date. If both expires
and maxAge
are set, then maxAge
is used.httpOnly
- The boolean
value of the HttpOnly
attribute. Defaults to true.secure
- The boolean
value of the Secure
attribute. Set this option to false when communicating over an unencrypted (HTTP) connection. Value can be set to auto
; in this case, the Secure
attribute will be set to false for an HTTP request. In the case of HTTPS, it will be set to true. Defaults to true.expires
- The expiration date
used for the Expires
attribute. If both expires
and maxAge
are set, then maxAge
is used.sameSite
- The boolean
or string
of the SameSite
attribute. Using Secure
mode with auto
attribute will change the behavior of the SameSite
attribute in http
mode. The SameSite
attribute will automatically be set to Lax
with an http
request. See this link.domain
- The Domain
attribute.partitioned
(experimental) - The boolean
value of the Partitioned
attribute. Using the Partitioned attribute as part of Cookies Having Independent Partitioned State (CHIPS) to allow cross-site access with a separate cookie used per site. Defaults to false.A session store. Needs the following methods:
Compatible to stores from express-session.
Defaults to a simple in-memory store.
Note: The default store should not be used in a production environment because it will leak memory.
Save sessions to the store, even when they are new and not modified— defaults to true
.
Setting this to false
can save storage space and comply with the EU cookie law.
Forces the session identifier cookie to be set on every response. The expiration is reset to the original maxAge - effectively resetting the cookie lifetime. This is typically used in conjuction with short, non-session-length maxAge values to provide a quick expiration of the session data with reduced potential of session expiration occurring during ongoing server interactions. Defaults to true.
Function used to generate new session IDs. Custom implementation example:
const uid = require('uid-safe').sync
idGenerator: (request) => {
if (request.session.returningVisitor) return `returningVisitor-${uid(24)}`
else return uid(24)
}
Allows to access or modify the session data.
Allows to destroy the session in the store. If you do not pass a callback, a Promise will be returned.
Updates the expires
property of the session's cookie.
Updates default options for setCookie inside a route.
fastify.post('/', (request, reply) => {
request.session.set('data', request.body)
// .options takes any parameter that you can pass to setCookie
request.session.options({ maxAge: 60 * 60 }); // 3600 seconds => maxAge is always passed in seconds
reply.send('hello world')
})
Regenerates the session by generating a new sessionId
and persist it to the store. If you do not pass a callback, a Promise will be returned.
fastify.get('/regenerate', (request, reply, done) => {
request.session.regenerate(error => {
if (error) {
done(error);
return;
}
reply.send(request.session.sessionId);
});
});
You can pass an array of fields that should be kept when the session is regenerated
Reloads the session data from the store and re-populates the request.session
object. If you do not pass a callback, a Promise will be returned.
Save the session back to the store, replacing the contents on the store with the contents in memory. If you do not pass a callback, a Promise will be returned.
Gets a value from the session
Sets a value in the session
Whether the session has been modified from what was loaded from the store (or created)
Whether the session (and any of its potential modifications) has persisted to the store
This plugin also decorates the fastify instance with decryptSession
in case you want to decrypt the session manually.
const { sessionId } = fastify.parseCookie(cookieHeader);
const request = {}
fastify.decryptSession(sessionId, request, () => {
// request.session should be available here
})
// or decrypt with custom cookie options:
fastify.decryptSession(sessionId, request, { maxAge: 86400 }, () => {
// ...
})
This plugin supports typescript, and you can extend fastify module to add your custom session type.
// Use module imports rather than commonjs' require for correct declaration merging in TypeScript.
// Wrong ❌:
// const fastifySession = require('@fastify/session');
// const fastifyCookie = require('@fastify/cookie');
// Correct ✔️:
import { fastifySession } from '@fastify/session';
import { fastifyCookie } from '@fastify/cookie';
// Extend fastify.session with your custom type.
declare module "fastify" {
interface Session {
user_id: string
other_key: your_prefer_type
id?: number
}
}
When you think that the getter or setter is too strict.
You are allowed to use any
types to loosen the check.
fastify.get('/', async function(request) {
request.session.get<any>('not-exist')
request.session.set<any>('not-exist', 'happy')
})
FAQs
a session plugin for fastify
The npm package @fastify/session receives a total of 5,037 weekly downloads. As such, @fastify/session popularity was classified as popular.
We found that @fastify/session demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
Security News
NVD’s backlog surpasses 20,000 CVEs as analysis slows and NIST announces new system updates to address ongoing delays.
Security News
Research
A malicious npm package disguised as a WhatsApp client is exploiting authentication flows with a remote kill switch to exfiltrate data and destroy files.