0.1.0 • Published 1 year ago

nestjs-easy-auth v0.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

NestJS Easy Auth

Elegant and simple authentication solution for NestJS.

@Module({
  imports: [
    AuthModule.withConfiguration({
      jwtConfig: {
        secret: 'my-secret',
        accessTokenExpiresIn: '1h',
        refreshTokenExpiresIn: '1d',
        tokenExtraction: ExtractJwt.fromAuthHeaderAsBearerToken(),
        ignoreExpiration: false
      },
      modelProvider: DefaultModelProvider.withModels({
        credentials: CredentialsMock,
        user: UserMock
      }),
      methods: [SignInEmailPassword.forRoot(), LogInEmailPassword.forRoot()]
    })
  ]
})
export class ApiModule {}

Table of Contents

Installation

You can install the package using the following commands:

$ yarn
yarn add nestjs-easy-auth

$ npm
npm install nestjs-easy-auth

Quick start

1. Provide your database

This package allows you to use your own database for the credentials and user storage. You can create your own CredentialsStorage and UserStorage.

You can use MongoDB as the main storage. Thi, you can install nestjs-easy-auth-mongo which provides a MongoDB implementation. To get started, import the AuthMongoProviderModule in your ApiModule.

$ yarn
yarn add nestjs-easy-auth-mongo

$ npm
npm install nestjs-easy-auth-mongo
@Module({
  imports: [
    AuthMongoProviderModule.withConfiguration({
      dbName: 'your-database-name',
      uri: 'mongodb://user:password@127.0.0.1:27017',
      schemas: {
        credentials: DBCredentialsSchema,
        user: DBUserSchema
      }
    })
  ]
})
export class ApiModule {}

2. Provide your jwt configuration

Provide your jwt configuration using the jwtConfig property.

AuthModule.withConfiguration({
  jwtConfig: {
    secret: 'my-secret',
    accessTokenExpiresIn: '1h',
    refreshTokenExpiresIn: '1d',
    tokenExtraction: ExtractJwt.fromAuthHeaderAsBearerToken(),
    ignoreExpiration: false
  }
});

3. Provide your models

This package allows you to use your own Credentials and User models. Your models needs to conforms to the CredentialsRepresentation and UserRepresentation interfaces.

export class Credentials implements CredentialsRepresentation<DBCredentials, PublicCredentials> {
  public constructor(
    public readonly userId: string,
    public readonly authType: string,
    public readonly accessToken: string,
    public readonly refreshToken: string,
    public readonly accessTokenExpiration: Date,
    public readonly refreshTokenExpiration: Date
  ) {}

  // Required to convert the model to a database model.
  public toDatabaseModel(): DBCredentials {
    return new DBCredentials(
      this.userId,
      this.authType,
      this.accessToken,
      this.refreshToken,
      this.accessTokenExpiration,
      this.refreshTokenExpiration
    );
  }

  // Required to convert the model to a public model.
  public toPublicModel(): PublicCredentials {
    return new PublicCredentials(
      this.userId,
      this.authType,
      this.accessToken,
      this.refreshToken,
      this.accessTokenExpiration,
      this.refreshTokenExpiration
    );
  }
}
export class User implements UserRepresentation<DBUser, PublicUser> {
  public constructor(
    public readonly id: string,
    public readonly email: string,
    public readonly hashedPassword?: string
  ) {}

  // Required to convert the model to a database model.
  public toDatabaseModel(): DBUser {
    return new DBUser(this.id, this.email, this.hashedPassword);
  }

  // Required to convert the model to a public model.
  // Do not include the hashed password in the public model.
  public toPublicModel(): PublicUser {
    return new PublicUser(this.id, this.email);
  }
}

You can provide your models using the DefaultModelProvider class.

AuthModule.withConfiguration({
  jwtConfig: { ... },
  modelProvider: DefaultModelProvider.withModels({
    credentials: CredentialsMock,
    user: UserMock
  })
});

4. Provide your authentication methods

You can provide your authentication methods using the methods property. These methods will be used to authenticate your users.

AuthModule.withConfiguration({
  jwtConfig: { ... },
  modelProvider: DefaultModelProvider.withModels({ ... }),
  methods: [SignInEmailPassword.forRoot(), LogInEmailPassword.forRoot()]
});

With theses methods, you can create and authentify users using their email and password with the following HTTP requests:

POST /auth/sign-in
{
  "email": "user@yourdomain.com",
  "password": "my-password"
}
POST /auth/login
{
  "email": "user@yourdomain.com",
  "password": "my-password"
}

You can also refresh you credentials using the POST /auth/refresh endpoint.

POST /auth/refresh
{
  "refresh_token": "your-refresh-token"
}

Documentation

Authentication methods

SignInEmailPassword

Inputs

PropertyExample
emailuser@yourdomain.com
passwordyourpassword

Options

OptionDefault value
hashPasswordSignInEmailPassword.brcyptHash

LoginEmailPassword

Inputs

PropertyExample
emailuser@yourdomain.com
passwordyourpassword

Options

OptionDefault value
comparePasswordLoginEmailPassword.bcryptPasswordComparison