NestJs 集成 OIDC

发布时间 2023-07-14 17:07:49作者: 楚小九

要将 OIDC 集成到 NestJS 中,可以按照以下步骤进行操作:

首先,确保已经安装了 @nestjs/passport 和 passport 这两个依赖包,以便使用 Passport 和 OIDC 策略。

npm install --save @nestjs/passport passport

然后,安装用于 OIDC 的 Passport 策略包。这里以 passport-openidconnect 为例。

npm install --save passport-openidconnect

创建一个 OIDC 策略文件,比如 oidc.strategy.ts,并将以下代码添加到文件中:

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { OpenIdConnectStrategy } from 'passport-openidconnect';

@Injectable()
export class OidcStrategy extends PassportStrategy(OpenIdConnectStrategy, 'oidc') {
  constructor() {
    super({
      issuer: 'https://your-oidc-provider.com', // OIDC 提供者的 URL
      clientID: 'your-client-id', // 您的客户端 ID
      clientSecret: 'your-client-secret', // 您的客户端密钥
      callbackURL: 'http://localhost:3000/auth/oidc/callback', // OIDC 验证成功后的回调 URL
      scope: 'openid profile', // 请求的 OIDC 范围
    });
  }

  async validate(accessToken: string, refreshToken: string, profile: any) {
    // 在此处处理验证后的用户数据
    return profile;
  }
}

添加策略到控制器或模块中,以便使用该策略:

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { OidcStrategy } from './oidc.strategy';

@Controller('auth')
export class AuthController {
  constructor(private readonly oidcStrategy: OidcStrategy) {}

  @Get('oidc')
  @UseGuards(AuthGuard('oidc'))
  async oidcAuth() {
    // 这里不需要执行任何操作,只需使用 @UseGuards() 注解来应用 OIDC 策略即可
  }

  @Get('oidc/callback')
  @UseGuards(AuthGuard('oidc'))
  async oidcCallback() {
    // 这里不需要执行任何操作,只需使用 @UseGuards() 注解来应用 OIDC 策略即可
  }
}

最后,将 OIDC 模块添加到应用程序的根模块中:

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { AuthController } from './auth.controller';
import { OidcStrategy } from './oidc.strategy';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'oidc' }),
  ],
  controllers: [AuthController],
  providers: [OidcStrategy],
})
export class AppModule {}

完成上述步骤后,NestJS 应用程序就可以使用 OIDC 策略进行认证了。可以通过访问 /auth/oidc 路径来启动 OIDC 认证流程,当验证成功后,将会重定向到 /auth/oidc/callback 路径并返回验证后的用户数据。您可以在 validate 方法中对验证后的用户数据进行处理。