Token Extraction

The library needs to find the JWT token in the request. By default, it looks in the Authorization header:

Authorization: Bearer 

That's fine for most APIs. But sometimes you need tokens from cookies, custom headers, or query parameters.

From cookies

import { CognitoAuthModule } from '@nestjs-cognito/auth';
import { CookieJwtExtractor } from '@nestjs-cognito/core';

@Module({
  imports: [
    CognitoAuthModule.register({
      jwtExtractor: new CookieJwtExtractor('access_token'), // cookie name
      jwtVerifier: {
        userPoolId: 'us-east-1_xxxxx',
        clientId: 'your-client-id',
        tokenUse: 'access',
      },
    }),
  ],
})
export class AppModule {}

Your frontend sets the cookie:

document.cookie = `access_token=${token}; path=/; secure; samesite=strict`;

fetch('/api/protected', {
  credentials: 'include'  // Include cookies in request
});

From custom headers

import { CognitoJwtExtractor } from '@nestjs-cognito/core';

export class CustomHeaderExtractor implements CognitoJwtExtractor {
  hasAuthenticationInfo(request: any): boolean {
    return Boolean(request.headers['x-api-key']);
  }

  getAuthorizationToken(request: any): string | null {
    return request.headers['x-api-key'] || null;
  }
}

Register it:

import { CognitoAuthModule } from '@nestjs-cognito/auth';

@Module({
  imports: [
    CognitoAuthModule.register({
      jwtExtractor: new CustomHeaderExtractor(),
      jwtVerifier: {
        userPoolId: 'us-east-1_xxxxx',
        clientId: 'your-client-id',
        tokenUse: 'access',
      },
    }),
  ],
})
export class AppModule {}

Client side:

fetch('/api/protected', {
  headers: { 'X-API-Key': token }
});

From query parameters

Useful for WebSockets where you can't set headers easily:

export class QueryParamExtractor implements CognitoJwtExtractor {
  hasAuthenticationInfo(request: any): boolean {
    return Boolean(request.query?.token);
  }

  getAuthorizationToken(request: any): string | null {
    return request.query?.token || null;
  }
}
GET /api/stream?token=

Try multiple sources

export class MultiSourceExtractor implements CognitoJwtExtractor {
  private extractors = [
    new BearerJwtExtractor(),
    new CookieJwtExtractor('access_token'),
  ];

  hasAuthenticationInfo(request: any): boolean {
    return this.extractors.some(extractor =>
      extractor.hasAuthenticationInfo(request)
    );
  }

  getAuthorizationToken(request: any): string | null {
    for (const extractor of this.extractors) {
      if (extractor.hasAuthenticationInfo(request)) {
        return extractor.getAuthorizationToken(request);
      }
    }
    return null;
  }
}

Checks Bearer header first, then cookies.