toondaey / nestjs-oauth2-server

A Nestjs wrapper for OAuth2 server.
MIT License
51 stars 15 forks source link

Nestjs OAuth2 Server

Nest Logo OAuth2 Logo

npm Coveralls github npm version LICENCE CircleCI build synk vulnerabilities

A Nestjs wrapper module for the oauth2-server package.

Table of content (click to expand) - [Installation](#installation) - [Configuration](#configuration) - [Usage](#usage) - [Learnings](#learnings) - [Contributing](#contributing)

Installation

Installation is as simple as running:

npm install @t00nday/nestjs-oauth2-server

or

yarn add @t00nday/nestjs-oauth2-server.

Configuration

  1. Include the module as a dependency in the module where pdf will be generated:

app.module.ts

import { Module } from '@nestjs/common';
import { OAuth2ServerModule } from '@t00nday/nestjs-oauth2-server';

@Module({
    imports: [
        // ... other modules
        OAuth2ServerModule.forRoot({}),
    ],
})
export class AppModule {}

In addition to the above the, oauth2-server requires a model to create the server. This can be provided as a service from any part of the application. This should be able to fetch data about clients, users, token, and authorization codes. This MUST be a service decorated with the OAuth2Model decorator.

import { OAuth2Model } from '@t00nday/nestjs-oauth2-server';

@OAuth2Model()
export class OAuth2ModelService
    implements RequestAuthenticationModel {
    getAccessToken() {}

    verifyScope() {}
    // ...
}

Usage

The module also provides some nifty decorators to help with configuring the oauth2 handler endpoints. An example controller covering the entire array of decorators is given below

import { Controller } from '@nestjs/common';
import {} from '@t00nday/nestjs-oauth2-server';

@Controller()
export class ExampleController {
    @Post()
    @OAuth2Authenticate()
    authenticateClient(@OAuth2Token() token: Token) {
        return of(token);
    }

    @OAuth2Authorize()
    @Post()
    authorizeClient(
        @OAuth2Authorization()
        authorization: AuthorizationCode,
    ) {
        return of(authorization);
    }

    @Post()
    @OAuth2RenewToken()
    renewToken(@OAuth2Token() token: Token) {
        return of(token);
    }
}

Async Configuration

The module could also be included asynchronously using the forRootAsync method.

Examples below:

import { Module } from '@nestjs/common';
import {
    OAuth2ServerModule,
    IOAuth2ServerModuleOptions,
} from '@t00nday/nestjs-oauth2-server';

@Module({
    imports: [
        // ... other modules
        OAuth2ServerModule.forRootAsync({
            useFactory: (): IOAuth2ServerModuleOptions => ({}),
        }),
    ],
})
export class AppModule {}

./oauth2-server-config.service.ts

import {
    IOAuth2ServerModuleOptions,
    IOAuth2ServerOptionsFactory,
} from '@t00nday/nestjs-oauth2-server';
import { Injectable } from '@nestjs/common';

@Injectable()
export class OAuth2ServerConfigService
    implements IOAuth2ServerOptionsFactory {
    createOAuth2ServerOptions(): IOAuth2ServerModuleOptions {
        return {};
    }
}

The OAuth2ServerConfigService SHOULD implement the IOAuth2ServerOptionsFactory, MUST declare the createOAuth2ServerOptions method and MUST return IOAuth2ServerModuleOptions object.

import { Module } from '@nestjs/common';
import { OAuth2ServerModule } from '@t00nday/nestjs-oauth2-server';
import { OAuth2ServerConfigService } from './oauth2-server-config.service.ts';

@Module({
    imports: [
        // ... other modules
        OAuth2ServerModule.forRootAsync({
            useClass: OAuth2ServerConfigService,
        }),
    ],
})
export class AppModule {}

Learnings

The concept of OAuth2 can be further understood in this article here. Also you can head over to the oauth2-server package documentation

Contributing

Suggestions for improvement are welcomed, however, please adhere to the contributing guidelines