使用 AuthGuard 登录请求始终为 401 Unauthorized
Login request is always 401 Unauthorized with AuthGuard
我一直在关注 this tutorial 并尝试将其转换为 GraphQL。我正在尝试实施 NestJS + GraphQL + Passport + Express-Session 解决方案,但我遇到了 AuthGuard
的问题。遗憾的是,网上关于此的信息很少。我的 AuthGuard 看起来像这样
import { ExecutionContext, Injectable } from '@nestjs/common';
import { ExecutionContextHost } from '@nestjs/core/helpers/execution-context-host';
import { GqlExecutionContext } from '@nestjs/graphql';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class LocalGuard extends AuthGuard('local') {
async canActivate(context: ExecutionContext): Promise<boolean> {
const ctx = GqlExecutionContext.create(context);
const { req } = ctx.getContext();
const result = (await super.canActivate(
new ExecutionContextHost([req]),
)) as boolean;
console.log(result);
await super.logIn(req);
return result;
}
}
不幸的是,我在尝试登录请求时总是收到 Unauthorized
响应。我认为问题出在我的 super.canActivate
电话上。
更新:这是我的 AuthGuard 实现,它终于起作用了。覆盖 getRequest 并将我的输入添加到正文可以解决问题。
import { ExecutionContext, Injectable } from '@nestjs/common';
import { GqlExecutionContext } from '@nestjs/graphql';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class LocalGuard extends AuthGuard('local') {
async canActivate(context: ExecutionContext): Promise<boolean> {
const result = (await super.canActivate(context)) as boolean;
const ctx = GqlExecutionContext.create(context);
const { req } = ctx.getContext();
await super.logIn(req);
return result;
}
getRequest(context: ExecutionContext) {
const ctx = GqlExecutionContext.create(context);
const gqlReq = ctx.getContext().req;
if (gqlReq) {
const { authCredentialsInput } = ctx.getArgs();
gqlReq.body = authCredentialsInput;
return gqlReq;
}
}
}
我一直在关注 this tutorial 并尝试将其转换为 GraphQL。我正在尝试实施 NestJS + GraphQL + Passport + Express-Session 解决方案,但我遇到了 AuthGuard
的问题。遗憾的是,网上关于此的信息很少。我的 AuthGuard 看起来像这样
import { ExecutionContext, Injectable } from '@nestjs/common';
import { ExecutionContextHost } from '@nestjs/core/helpers/execution-context-host';
import { GqlExecutionContext } from '@nestjs/graphql';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class LocalGuard extends AuthGuard('local') {
async canActivate(context: ExecutionContext): Promise<boolean> {
const ctx = GqlExecutionContext.create(context);
const { req } = ctx.getContext();
const result = (await super.canActivate(
new ExecutionContextHost([req]),
)) as boolean;
console.log(result);
await super.logIn(req);
return result;
}
}
不幸的是,我在尝试登录请求时总是收到 Unauthorized
响应。我认为问题出在我的 super.canActivate
电话上。
更新:这是我的 AuthGuard 实现,它终于起作用了。覆盖 getRequest 并将我的输入添加到正文可以解决问题。
import { ExecutionContext, Injectable } from '@nestjs/common';
import { GqlExecutionContext } from '@nestjs/graphql';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class LocalGuard extends AuthGuard('local') {
async canActivate(context: ExecutionContext): Promise<boolean> {
const result = (await super.canActivate(context)) as boolean;
const ctx = GqlExecutionContext.create(context);
const { req } = ctx.getContext();
await super.logIn(req);
return result;
}
getRequest(context: ExecutionContext) {
const ctx = GqlExecutionContext.create(context);
const gqlReq = ctx.getContext().req;
if (gqlReq) {
const { authCredentialsInput } = ctx.getArgs();
gqlReq.body = authCredentialsInput;
return gqlReq;
}
}
}