目录

API Token 认证策略

作用于全局的固定Token认证方式

优点

  • 可以给计划任务进行调用
  • 可以给外部服务进行调用
  • 整体实现简单,方便

缺点

  • 不利于管理
  • 不含角色,无法进行权限管理

实现

配置文件

config/app.config.ts

import { registerAs } from "@nestjs/config";

export default registerAs(
  "app", () => ({
    x_auth_token: "123456",
  })
);

拦截器

common/guards/token-auth.guard.ts

import _ from 'lodash';

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Observable } from 'rxjs';

@Injectable()
export class TokenGuard implements CanActivate {

  constructor(
    private readonly configService: ConfigService,
  ) {}

  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const
      request     = context.switchToHttp().getRequest<Request | any>(),
      xAuthToken  = request.get(`X-AUTH-TOKEN`) || request.query[`X-AUTH-TOKEN`],
      authorizers = [
        xAuthToken === this.configService.get(`app.x_auth_token`),
        process.platform && process.platform === `win32`,
      ];

    return ! _(authorizers).filter().isEmpty();
  }

}

拦截器使用

app.modules.ts

import from "./common/guards/token-auth.guard.ts";

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: TokenAuthGuard,
    },
  ]
})
export class AppModule {}