npm package: @monksdevsp/nest-authorizer
Description: Authorization service for Neurons on NestJS
Author: monks-sp
Latest version: 1.0.6-beta

<p align="center">
  <a href="http://nestjs.com"><img alt="Nest Logo" src="https://nestjs.com/img/logo-small.svg" width="120"></a>
</p>

<h1 align="center">
  neurons-authorizer
</h1>

<p align="center">
  A <a href="https://github.com/nestjs/nest">Nest</a> interceptor wrapper for authorize private routes by using custom authentication services endpoints.
</p>

## Installation

```bash
npm i -S @monksdevsp/nest-authorizer
```
---
⚠️ This is the very first beta version of the Interceptor module for NestJS applications. It's still in test and development stage and not ready for production.


## Quick start

In your environment variables you must create the variable that points to your service authorizer. Otherwise you will receive an exception due to the lack of environment variable configuration or if the service url is invalid:
```bash
AUTHORIZER_SERVICE=https://your-authorizer-url.com/your-end-point
```

The interceptor will extract the `authorization bearer token` and `x-access-token` from the header, or `access_token` parameter from the url using <a href="https://www.npmjs.com/package/passport-jwt">passport-jwt</a> and will request the authorization service using the token extracted in the header to validate the token authenticity by the auth service rules:
```typescript
...
ExtractJwt.fromAuthHeaderAsBearerToken(),
ExtractJwt.fromUrlQueryParameter('access_token'),
ExtractJwt.fromHeader('x-access-token'),
...
```

Import `NeuronsAuthorizerModule` into the root `AppModule` or any other module you want. The Authorizer module is a Global module with the `@Global()`:

forRoot() configuration

```typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { NeuronsAuthorizerModule } from '@monksdevsp/nest-authorizer';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot(),
    NeuronsAuthorizerModule.forRoot({
      authServiceUrl: process.env.AUTHORIZER_SERVICE_URL,
      consumer: 'my-service-name',
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
```
## Async configuration
forRootAsync() 

```typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { NeuronsAuthorizerModule } from '@monksdevsp/nest-authorizer';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    NeuronsAuthorizerModule.forRootAsync({
      useFactory: async (configService: ConfigService) => ({
        authServiceUrl: configService.get('AUTHORIZER_SERVICE_URL'),
        consumer: 'my-service-name',
      }),
      inject: [ConfigService]
    })
  ],
})
export class AppModule {}
```

Afterward, the Neuron Authorizer will be available to inject on @UserInterceptors() annotation:

```typescript
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import { NeuronsAuthorizerInterceptor } from '@monksdevsp/nest-authorizer';

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

  @UseInterceptors(NeuronsAuthorizerInterceptor)
  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}
```

To make the entire Controller authenticated, just move the <a href="https://docs.nestjs.com/interceptors">interceptor</a> decorator like this:

```typescript
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import { NeuronsAuthorizerInterceptor } from '@monksdevsp/nest-authorizer';

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

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}
```