Nestjs azure 活动目录和 graphql - UseGuard
Nestjs azure active directory and graphql - UseGuard
使用 nestjs 和 graphql 构建 API 我想实施 Azure Active Directory 以进行授权。
他们提供了一个包含策略的 passport-azure-ad
包。
当我将 nestjs 守卫添加到 REST 端点时它工作得很好,但是使用 GrapQL 解析器时它会抛出错误 Cannot read property 'query' of undefined
.
Nestjs docs 给出了一些提示,但我不知道如何实现和使 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
的 GraphQL 配置
...
imports: [
GraphQLModule.forRoot({
autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
sortSchema: true,
context: ({ req }) => ({ req }),
}),
...
通行证策略是可能寻找request
的query
参数,它不能立即从GQL请求中获得。要解决此问题,您可以制作一个 extends AuthGuard('azure-ad')
的自定义守卫,并使用以下方法将 getRequest()
方法覆盖为 return 传入的 req
对象:
@Injectable()
export class AzureADGuard extends AuthGuard('azure-ad') {
getRequest(context: ExecutionContext) {
const gql = GqlExecutionContext.create(context);
return gql.getContext().req;
}
}
使用 nestjs 和 graphql 构建 API 我想实施 Azure Active Directory 以进行授权。
他们提供了一个包含策略的 passport-azure-ad
包。
当我将 nestjs 守卫添加到 REST 端点时它工作得很好,但是使用 GrapQL 解析器时它会抛出错误 Cannot read property 'query' of undefined
.
Nestjs docs 给出了一些提示,但我不知道如何实现和使 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 }),
}),
...
通行证策略是可能寻找request
的query
参数,它不能立即从GQL请求中获得。要解决此问题,您可以制作一个 extends AuthGuard('azure-ad')
的自定义守卫,并使用以下方法将 getRequest()
方法覆盖为 return 传入的 req
对象:
@Injectable()
export class AzureADGuard extends AuthGuard('azure-ad') {
getRequest(context: ExecutionContext) {
const gql = GqlExecutionContext.create(context);
return gql.getContext().req;
}
}