1.2.0 • Published 8 months ago

decentraland-crypto-middleware v1.2.0

Weekly downloads
-
License
Apache-2.0
Repository
github
Last release
8 months ago

Decentraland Authentication Middleware

Coverage Status

A multi framework middleware to authenticate request signed with @decentraland/SignedFetch

Index

Install

  npm install -s decentraland-crypto-middleware

Use with Express

import { Request } from 'express'
import * as dcl from 'decentraland-crypto-middleware'

app.get(
  '/user/required',
  dcl.express(),
  (req: Request & dcl.DecentralandSignatureData) => {
    const address: string = req.auth
    const metadata: Record<string, any> = req.authMetadata
  }
)

app.get(
  '/user/optional',
  dcl.express({ optional: true }),
  (req: Request & dcl.DecentralandSignatureData) => {
    const address: string | undefined = req.auth
    const metadata: Record<string, any> | undefined = req.authMetadata
  }
)

Use with Koa

import { Context } from 'koa'
import * as dcl from 'decentraland-crypto-middleware'

app.get(
  '/user/required',
  dcl.koa(),
  (ctx: Context & dcl.DecentralandSignatureData) => {
    const address: string = ctx.auth
    const metadata: Record<string, any> = ctx.authMetadata
  }
)

app.get(
  '/user/optional',
  dcl.koa({ optional: true }),
  (ctx: Context & dcl.DecentralandSignatureData) => {
    const address: string | undefined = ctx.auth
    const metadata: Record<string, any> | undefined = ctx.authMetadata
  }
)

Use with Well Known Components

import type { IHttpServerComponent } from '@well-known-components/interfaces'
import * as dcl from 'decentraland-crypto-middleware'

app.use('/user/required', dcl.wellKnownComponents())
app.get('/user/required', (ctx: dcl.DecentralandSignatureRequiredContext) => {
  const address: string = ctx.verification.auth
  const metadata: Record<string, any> = ctx.verification.authMetadata
})

app.use('/user/optional', dcl.wellKnownComponents({ optional: true })
app.get('/user/optional', (ctx: dcl.DecentralandSignatureContext<{}>) => {
  const address: string | undefined= ctx.verification?.auth
  const metadata: Record<string, any> | undefined = ctx.verification?.authMetadata
})

Use with PassportJS

import { Context } from 'koa'
import * as dcl from 'decentraland-crypto-middleware'

passport.use(dcl.passport())

app.get(
  '/user/required',
  passport.authenticate('decentraland'),
  (req: Request & dcl.DecentralandSignatureData) => {
    const address: string = req.auth
    const metadata: Record<string, any> = req.authMetadata
  }
)

app.get(
  '/user/required',
  passport.authenticate('decentraland', { optional: true }),
  (req: Request & dcl.DecentralandSignatureData) => {
    const address: string | undefined = req.auth
    const metadata: Record<string, any> | undefined = req.authMetadata
  }
)

Options

nametypedescription
optionalbooleanif false request will fail if there is no signature or if is invalid (default: false)
expirationnumbertime in milliseconds where a signature is considered valid (default: 60_000)
catalyststringcatalyst url to validate contract wallet signatures (default: https://peer-lb.decentraland.org/)
onError(err: Error & { statusCode: number }) => anyformats the response body when an error occurred (default: (err) => ({ ok: false, message: err.message }))

Auth Chain Generator

If you want to simulate signed headers you can use the Auth Chain Generator

Develop

If you want to contribute make you will need to setup husky otherwise your commit may fail because is not following the format standard

  npm run husky-setup