Token signing
Besides the common things like token authorization, the middleware comes with handy functions responsible for token signing.
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.
import { generateToken } from '@marblejs-contrib/middleware-jwt';
generateToken :: GenerateOptions -> Payload -> string
parameter | definition |
options | GenerateOptions |
payload | Payload = string | object | Buffer |
GenerateOptions
Config object which defines a set of parameters that are used for token signing.
parameter | definition |
secret | string | Buffer |
algorithm | <optional> string |
keyid | <optional> string |
expiresIn | <optional> string | number |
notBefore | <optional> string | number |
audience | <optional> string | string[] |
subject | <optional> string |
issuer | <optional> string |
jwtid | <optional> string |
noTimestamp | <optional> boolean |
header | <optional> object |
encoding | <optional> string |
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.
import { generateExpirationInHours } from '@marblejs-contrib/middleware-jwt';
generateExpirationInHours :: number -> number
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
});
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)
)),
)));
Last modified 1yr ago