@polyrithm/api-auth

Pluggable JWT API Authentication Module for NestJS Applications

Usage no npm install needed!

<script type="module">
  import polyrithmApiAuth from 'https://cdn.skypack.dev/@polyrithm/api-auth';
</script>

README

api

Shareable JWT API Authentication service for NestJS Applications

Usage

//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from '@polyrithm/api-auth';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from '@polyrithm/api-auth';
import { environment } from '../environments/environment';

@Module({
  imports: [
    AuthModule.forRoot({expiresIn: 3600, secret: environment.jwt_secret}),
    TypeOrmModule.forRoot(
      {
        "type": "mysql",
        "host": "localhost",
        "port": 3306,
        "username": "username",
        "password": "password",
        "database": "database",
        "entities": [

          User // Add User Entity from @polyrithm/api-auth
        ],
        "synchronize": true,
        "connectTimeout": 5000
      }

    )
  ],
  controllers: [AppController],
  providers: [
    AppService
  ]
})

export class AppModule {}

Guarded Routes

By default all routes are guarded. We prefer using an inversion principle and make controllers or handlers public explicitly by using the @Public() decorator on the controller or handlers which expose public routes

// app.controller.ts
import { Controller, Get } from '@nestjs/common';

import { Message } from '@hippopdf/shared';

import { AppService } from './app.service';
import { Public } from '@polyrithm/api-auth';

@Public()
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get('hello')
  getData(): Message {
    return this.appService.getData();
  }
}


Available Auth Endpoints

Register


Register a new user

  • URL

    /auth/register

  • Method:

    POST

  • Data Params

    • Schema: AuthCredentials

      Payload:

      {
        "name": "string",
        "email": "string",
        "password": "string"
      }
      
  • Success Response:

    • Code: 201
  • Error Response:

    • Code: 400 BAD REQUEST
      Content:

        {
          "statusCode": 400,
          "error": "Bad Request",
          "message": [
            {
                "target": {
                    "email": "",
                    "password": ""
                },
                "value": "",
                "property": "email",
                "children": [],
                "constraints": {
                    "isEmail": "email must be an email",
                    "isNotEmpty": "email should not be empty"
                }
            },
            {
                "target": {
                    "email": "",
                    "password": ""
                },
                "value": "",
                "property": "password",
                "children": [],
                "constraints": {
                    "matches": "The string must contain at least 1 numeric character",
                    "minLength": "password must be longer than or equal to 8 characters",
                    "isNotEmpty": "password should not be empty"
                }
            }
          ]
        }
      

Login

Login user

  • URL

    /auth/login

  • Method:

    POST

  • Data Params

    • Schema: AuthCredentials

      Payload:

      {
        "email": "string",
        "password": "string"
      }
      
  • Success Response:

    • Code: 201
    • Body
    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpvaG5AZG9lLmNvbSIsImlhdCI6MTU2NjgxMjQ0MCwiZXhwIjoxNTY2ODE2MDQwfQ.tXThbN6ZXT9TknTKM4TRiJ45Xq5bzPP8MECemrsew2k"
    }
    
  • Error Response:

    • Code: 401 UNAUTHORIZED
      Content:

      {
        "statusCode": 401,
        "error": "Unauthorized",
        "message": "Invalid Credentials"
      }