我想知道如何在ConfigService中注入PassportModule AuthGuard中的自定义参数?
这是我的密码
auth.module.ts
@Module({
imports: [
PassportModule.registerAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService): Promise<IAuthModuleOptions> => {
return {}
}
}),
],
// ...
})
export class AuthModule {}github-auth.guard.ts
@Controller('auth')
export class AuthController {
// ...
@Get('github-oauth')
@UseGuards(new GithubAuthGuard({}))
async githubOAuth(@Req() req: Request, @Res() res: Response) {
const user = req.user
return await this.handleOauth(user, req, res)
}
}github-auth.guard.ts
import { ConfigService } from '@nestjs/config'
import { AuthGuard } from '@nestjs/passport'
@Injectable()
export class GithubAuthGuard extends AuthGuard('github') {
constructor(private readonly configService: ConfigService) {
super()
}
//...
}我使用UseGuards调用new GithubAuthGuard({}),因为我希望传递自定义参数。
更新:
AuthGuard('github')返回一个被轮转的类,可以接受选项,然后传递给我的自定义策略的authenticate函数作为第二个参数。
这是我的github.strategy.ts
import { Strategy } from 'passport'
class StrategyFoo extends Strategy {
constructor(options, verify) {
//...
}
// options from AuthGuard('github')
authenticate(req, options) {
const self = this
const redirect_uri = options.callbackURL || this._options.callbackURL
// ...
}
}
@Injectable()
export class GithubBarStrategy extends PassportStrategy(StrategyFoo, 'github') {
//...
}
export const GithubStrategy = GithubBarStrategy发布于 2022-08-12 16:39:23
经过一番研究,我想出了办法
巢不会在手动实例化的类上注入任何内容。
因此,只需调用@UseGuards(GithubAuthGuard),然后在github-auth.guard.ts或github.strategy.ts中注入ConfigService,如:
注射github-auth.guard.ts
@Injectable()
export class GithubAuthGuard extends AuthGuard('github') {
// @Inject(ConfigService)
// private configService: ConfigService
constructor(private readonly configService: ConfigService) {
//
const options = {
callbackURL: configService.get('OAuth.github.callbackURL'),
//...
}
super(options)
}
getAuthenticateOptions(context) {
// this also works
return {
callbackURL: this.configService.get('OAuth.github.callbackURL'),
//...
}
}
// ...
}或
注射github.strategy.ts
class StrategyFoo extends Strategy {
private _options: any
constructor(options, verify) {
//...
this._options = options
// ...
}
authenticate(req, options) {
// ...
let _options = {
...options,
...this._options
}
// ...
}
}
@Injectable()
export class GithubBarStrategy extends PassportStrategy(StrategyFoo, 'github') {
constructor(private readonly configService: ConfigService) {
super({
passReqToCallback: true,
callbackURL: this.configService.get('OAuth.github.callbackURL'),
// ...
})
}
// ...
}https://stackoverflow.com/questions/73336429
复制相似问题