NestJS GraphQL 中的“res.setHeader 不是函数”错误 Google Auth 策略

问题描述 投票:0回答:1

我尝试使用 GraphQL 和 Google auth 来实现 oauth 方法,但由于某种原因,我收到以下错误 Google 策略中的验证方法中的“res.setHeader 不是函数” 我使用了

passport-google-oauth20
策略

这是我的 google-auth.guard.ts

import { ExecutionContext, Injectable } from '@nestjs/common';
import { GqlExecutionContext } from '@nestjs/graphql';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class GoogleAuthGuard extends AuthGuard('google') {
    getRequest(context: ExecutionContext) {
        const ctx = GqlExecutionContext.create(context);
        const gqlReq = ctx.getContext().req;
        if (gqlReq) {
          const { token } = ctx.getArgs();
          gqlReq.body = { token };
          return gqlReq;
        }
        return context.switchToHttp().getRequest();
      }
}

这是我的 google.strategy.ts

import { PassportStrategy } from '@nestjs/passport';
import { Strategy, VerifyCallback } from 'passport-google-oauth20';

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { Profile } from 'passport';

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {

  constructor() {
    super({
      clientID: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_SECRET,
      callbackURL: process.env.GOOGLE_REDIRECT_URL,
      prompt: 'consent',
      scope: ['email', 'profile'],
    })
  }

  async validate(
    accessToken: string,
    refreshToken: string,
    profile: Profile,
    done: VerifyCallback,
  ): Promise<any> {
    if (!profile) {
      return done(new UnauthorizedException(), false);
    }
    return done(null, profile);
  }
}

需要指出的是,由于我的应用程序是一个React SPA,因此callbackURL值是客户端的主页,而不是服务器中的另一个路径。

以及我打算用来生成 jwt 令牌和刷新令牌的解析器,但由于策略中的错误,代码永远不会到达这部分

@UseGuards(GoogleAuthGuard)
@Query(() => LoginResponseApi)
async googleLogin(
    @Args({ name: 'token', type: () => String }) token: string,
    @Req() req,
    @Context() context
): Promise<LoginResponseApi> {
    const res: Response = context.req.res;

    const loginResponse: any = await this.authService.googleLogin(req)
    const jwtToken = this.authService.createRefreshToken(loginResponse.user)

    if (loginResponse.accessToken)
        this.authService.sendRefreshToken(res, jwtToken)

    return loginResponse;
}
graphql jwt nestjs passport.js google-authentication
1个回答
0
投票

你解决了吗?我也有同样的症状

© www.soinside.com 2019 - 2024. All rights reserved.