首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有PassportModule自定义AuthGuard注入ConfigService的雀巢?

带有PassportModule自定义AuthGuard注入ConfigService的雀巢?
EN

Stack Overflow用户
提问于 2022-08-12 15:23:30
回答 1查看 36关注 0票数 0

我想知道如何在ConfigService中注入PassportModule AuthGuard中的自定义参数?

这是我的密码

auth.module.ts

代码语言:javascript
复制
@Module({
  imports: [
    PassportModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService): Promise<IAuthModuleOptions> => {
        return {}
      }
    }),
  ],
  // ...
})
export class AuthModule {}

github-auth.guard.ts

代码语言:javascript
复制
@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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-08-12 16:39:23

经过一番研究,我想出了办法

巢不会在手动实例化的类上注入任何内容。

因此,只需调用@UseGuards(GithubAuthGuard),然后在github-auth.guard.tsgithub.strategy.ts中注入ConfigService,如:

注射github-auth.guard.ts

代码语言:javascript
复制
@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

代码语言:javascript
复制
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'),
      // ...
    })
  }
  // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73336429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档