有谁知道我在哪里可以看到 AuthGuard('jwt') 中 canActivate 方法的完整代码?我意识到 canActivate 方法通过使用 console.log() 调用 JwtStrategy 验证方法,如下所示:
// jwt.strategy.ts
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(
private readonly configService: ConfigService,
private readonly usersService: UsersService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: true,
secretOrKey: configService.get<string>('JWT_SECRET'),
});
}
async validate(payload: any) {
try {
const user = await this.usersService.getUserById(payload.id);
// console.log is here
console.log(user);
return user;
} catch (e) {
console.log(e);
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用原始的 canActivate 方法,则会调用 console.log 。我认为 JwtStrategy 是一个中间件,因此只要有请求就会调用 validate 方法。但是,当我尝试重写 canActivate 方法来添加授权时,不会调用 JwtStrategy …
根据文档,为了使用 AuthGuard 进行 GraphQL 解析器的身份验证,我们必须重写getRequest如下方法:
getRequest(context: ExecutionContext) {
const ctx = GqlExecutionContext.create(context);
return ctx.getContext().req;
}
Run Code Online (Sandbox Code Playgroud)
我的大多数 API 使用 GraphQL,但其他 API 使用 REST 端点来处理文件上传。(我提到了这个)现在,我正在使用两个 AuthGuard。一种是针对 GraphQL,我getRequest像上面一样重写了它。另一种是针对 REST 的,其代码完全相同,除了(这次我没有覆盖它)以及调用后从请求中getRequest提取对象的方式。usercanActivate
图形语言:
// getRequest is overridden
const user: User = this.getRequest(context).user;
Run Code Online (Sandbox Code Playgroud)
休息:
// getRequest is NOT overridden
const { user } = context.switchToHttp().getRequest();
Run Code Online (Sandbox Code Playgroud)
有什么方法可以尝试将这两个 AuthGuard 合二为一吗?