Graphql NestJS-将用户数据从自定义身份验证保护传递到解析程序
我知道默认passport AuthGuard(“yourStrategy”)经常会问这个问题, 但是还没有找到自定义身份验证的答案 为什么我使用自定义身份验证保护?因为默认值和GraphQL似乎无法一起工作。 由于GraphQL端进行了一些更新,默认的AuthGuard无法再读取标头 我需要以某种方式将从承载令牌获得的用户数据传递给解析器。 护照怎么办?你会怎么做?我对nestJS非常陌生,缺乏文档和/或道具教程让我抓狂 相关代码: auth.guard.tsGraphql NestJS-将用户数据从自定义身份验证保护传递到解析程序,graphql,jwt,nestjs,Graphql,Jwt,Nestjs,我知道默认passport AuthGuard(“yourStrategy”)经常会问这个问题, 但是还没有找到自定义身份验证的答案 为什么我使用自定义身份验证保护?因为默认值和GraphQL似乎无法一起工作。 由于GraphQL端进行了一些更新,默认的AuthGuard无法再读取标头 我需要以某种方式将从承载令牌获得的用户数据传递给解析器。 护照怎么办?你会怎么做?我对nestJS非常陌生,缺乏文档和/或道具教程让我抓狂 相关代码: auth.guard.ts @Injectable() ex
@Injectable()
export class AuthGuard implements CanActivate {
constructor(readonly jwtService: JwtService/*, readonly userService: UsersService*/) { }
canActivate(context: ExecutionContext): boolean {
const ctx = GqlExecutionContext.create(context);
const request = ctx.getContext().request;
const Authorization = request.get('Authorization');
if (Authorization) {
const token = Authorization.replace('Bearer ', '');
const { userId, firstName } = this.jwtService.verify(token) as { userId: string; firstName: string } ;
return !!userId;
}
}
}
jwt.strategy.ts
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload) {
return {userId: payload.userId, firstName: payload.firstName};
}
}
auth.module.ts
@Module({
imports: [
forwardRef(() => UserModule) ,
PassportModule.register({
defaultStrategy: 'jwt'
}),
JwtModule.register({
secret: jwtConstants.secret,
signOptions: {expiresIn: 3600}
})],
providers: [AuthService, JwtStrategy, AuthResolver, AuthGuard],
exports: [AuthService, JwtModule, AuthGuard]
})
export class AuthModule {
}
示例解析器
@UseGuards(AuthGuard)
@Resolver((of) => UserSchema)
export class UserResolver {
constructor(private readonly userService: UserService) {}
// ===========================================================================
// Queries
// ===========================================================================
@Query(() => UserDto, {description: 'Searchs for a user by a given id'})
async getUserById(@Args('id') id: string) {
/*
* Instead of passing the userID as an query argument, get it from the bearer token / auth guard!
*/
const result = await this.userService.findById(id);
if(result) return result;
return new NotFoundException('User not found!');
}
}
提前谢谢你的帮助!;-)
编辑:如果您需要查看更多代码,可以使用my github repo:没关系。我自己也找到了解决办法。我找到了一个解决办法,让passport AuthGuard重新使用GraphQL。对于用户ID:使用自定义用户装饰器:没关系。我自己也找到了解决办法。我找到了一个解决办法,让passport AuthGuard重新使用GraphQL。对于userId:使用自定义用户装饰器: