Nestjs azure active directory和graphql-UseGuard

Nestjs azure active directory和graphql-UseGuard,graphql,azure-active-directory,passport.js,nestjs,Graphql,Azure Active Directory,Passport.js,Nestjs,使用nestjs和graphql构建API我想实现Azure Active Directory以进行授权。 他们提供了一个带有策略的passport azure ad包。 当我向REST端点添加nestjs保护时,它工作得很好,但是使用GrapQL解析器时,它抛出了一个错误无法读取未定义的属性“query” Nestjs给出了一些提示,但我不知道如何实现并使graphql查询可用于passport策略 我的警卫如下: import { Injectable } from '@nestjs/com

使用nestjs和graphql构建API我想实现Azure Active Directory以进行授权。 他们提供了一个带有策略的
passport azure ad
包。 当我向REST端点添加nestjs保护时,它工作得很好,但是使用GrapQL解析器时,它抛出了一个错误
无法读取未定义的属性“query”

Nestjs给出了一些提示,但我不知道如何实现并使graphql查询可用于passport策略

我的警卫如下:

import { Injectable } from '@nestjs/common';
import { PassportStrategy, AuthGuard } from '@nestjs/passport';
import { BearerStrategy } from 'passport-azure-ad';
import * as dotenv from 'dotenv';
dotenv.config();

const clientID = process.env.AZURE_AD_CLIENT_ID;
const tenantID = process.env.AZURE_AD_TENANT_ID;

/**
 * Extracts ID token from header and validates it.
 */
@Injectable()
export class AzureADStrategy extends PassportStrategy(
  BearerStrategy,
  'azure-ad',
) {
  constructor() {
    super({
      identityMetadata: `https://login.microsoftonline.com/${tenantID}/v2.0/.well-known/openid-configuration`,
      clientID,
    });
  }
  
  async validate(data) {
    console.log(data);
    return data;
  }
}

export const AzureADGuard = AuthGuard('azure-ad');
来自
app.module.ts

...
imports: [
 GraphQLModule.forRoot({
      autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
      sortSchema: true,
      context: ({ req }) => ({ req }),
    }),
...
passport策略可能正在查找
请求
查询
参数,GQL请求无法立即使用该参数。要解决此问题,您可以创建一个自定义保护,它
扩展AuthGuard('azure-ad')
,并覆盖
getRequest()
方法,以使用以下方法返回传入的
req
对象:

@Injectable()
导出类AzureADGuard扩展了AuthGuard('azure-ad')){
getRequest(上下文:ExecutionContext){
const gql=GqlExecutionContext.create(context);
返回gql.getContext().req;
}
}
passport策略可能正在查找
请求
查询
参数,GQL请求无法立即使用该参数。要解决此问题,您可以创建一个自定义保护,它
扩展AuthGuard('azure-ad')
,并覆盖
getRequest()
方法,以使用以下方法返回传入的
req
对象:

@Injectable()
导出类AzureADGuard扩展了AuthGuard('azure-ad')){
getRequest(上下文:ExecutionContext){
const gql=GqlExecutionContext.create(context);
返回gql.getContext().req;
}
}

就是这样。自定义保护现在可以用于GraphQL查询,我的帖子中的“纯”保护也可以用于REST查询,就是这样。自定义保护现在可以用于GraphQL查询,我的帖子中的“纯”保护也可以用于REST查询