我尝试使用 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;
}
你解决了吗?我也有同样的症状