Skip to content

Latest commit

 

History

History
113 lines (88 loc) · 3.27 KB

token-creation.md

File metadata and controls

113 lines (88 loc) · 3.27 KB
description
Besides the common things like token authorization, the middleware comes with handy functions responsible for token signing.

Token signing

+ generateToken

The middleware wraps auth0 jsonwebtoken API into more RxJS friendly functions that can be partially applied and composed inside Observable streams.

generateToken signs new JWT token with provided payload and configuration object which defines the way how the token is signed.

Importing

import { generateToken } from '@marblejs-contrib/middleware-jwt';

Type declaration

generateToken :: GenerateOptions -> Payload -> string

Parameters

parameter definition
options GenerateOptions
payload `Payload = string

{% tabs %} {% tab title="GenerateOptions" %} Config object which defines a set of parameters that are used for token signing.

parameter definition
secret `string
algorithm <optional> string
keyid <optional> string
expiresIn <optional> `string
notBefore <optional> `string
audience <optional> `string
subject <optional> string
issuer <optional> string
jwtid <optional> string
noTimestamp <optional> boolean
header <optional> object
encoding <optional> string
{% endtab %}
{% endtabs %}

{% hint style="info" %} For more details about JWT token signing, please visit jsonwebtoken package docs. {% endhint %}

+ generateExpirationInHours

The standard for JWT defines an exp claim for expiration. The expiration is represented as a NumericDate. This means that the expiration should contain the number of seconds since the epoch.

generateExpiratinoInHours is a small, but handy function that returns an numeric date for given hours as a parameter. If the function is called without any parameter then the date is generated with 1 hour expiration.

Importing

import { generateExpirationInHours } from '@marblejs-contrib/middleware-jwt';

Type declaration

generateExpirationInHours :: number -> number

Example

{% code title="token.helper.ts" %}

export const generateTokenPayload = (user: User) => ({
  id: user.id,
  email: user.email,
  exp: generateExpirationInHours(4), 
  // 👆 token will expire within the next 4 hours
});

{% endcode %}

{% code title="login.effect.ts" %}

import { r, HttpError, HttpStatus } from '@marblejs/http';
import { throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { generateTokenPayload } from './token.helper';

const login$ = r.pipe(
  r.matchPath('/login'),
  r.matchType('POST'),
  r.useEffect(req$ => req$.pipe(
    map(req => req.body),
    mergeMap(UserDao.findByCredentials),
    map(generateTokenPayload),
    // 👇
    map(generateToken({ secret: Config.jwt.secret })),
    map(token => ({ body: { token } })),
    catchError(() => throwError(() =>
      new HttpError('Unauthorized', HttpStatus.UNAUTHORIZED)
    )),
  )));

{% endcode %}