NestJs 集成 OIDC
要将 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 方法中对验证后的用户数据进行处理。