NodeJS Graphql shield返回未授权允许的突变

laawzig2  于 2023-03-12  发布在  Node.js
关注(0)|答案(2)|浏览(156)

我正在尝试使用apollo-server-express实现GraphQL API。我想通过graphql-shield中间件管理权限,但在允许执行变更方面遇到问题。我的目标是使用基于JWT的身份验证,但允许对未经身份验证的用户执行一些查询/变更,这是注册/登录变更所需的。为此,我使用默认的allow规则。但当我尝试运行登录变更时,我收到***未授权!***错误。我不知道为什么会这样。该规则适用于查询。
谢谢你的回答。

服务器

import express from "express";
import cors from "cors";
import { ApolloServer, makeExecutableSchema } from "apollo-server-express";
import config from "./config";
import mockResolver from "./resolvers/mockResolver";
import typeDefs from "./graphql/typeDefs";
import { applyMiddleware } from "graphql-middleware";
import permissions from "./graphql/permissions";

const app = express();
app.use(cors());

const server = new ApolloServer({
  schema: applyMiddleware(
    makeExecutableSchema({ typeDefs, resolvers: mockResolver }),
    permissions
  ),
  playground: true,
  introspection: true,
});

server.applyMiddleware({ app, path: "/graphql" });
app.listen(config.PORT, () =>
  console.log("Server listening at http://localhost:%s", config.PORT)
);

类型定义

import { gql } from "apollo-server";

const typeDefs = gql`
  type User {
    id: Int!
    email: String!
    password: String!
  }

  type LoginResponse {
    id: String
    email: String
    token: String
  }

  type Query {
    user(id: Int!): User
    users: [User]
  }

  type Mutation {
    login(email: String!, password: String!): LoginResponse
  }
`;

权限

import { shield, allow } from "graphql-shield";

const permissions = shield({
  Query: {
    users: allow,
  },
  Mutation: {
    login: allow,
  },
});

export default permissions;
rekjcdws

rekjcdws1#

const permissions = shield({
  Query: {
    users: allow,
  },
  Mutation: {
    login: allow,
  },
});

const permissions = shield({
  Query: {
    users: allow,
  },
  Mutation: {
    login: allow,
  },
},
{
  debug: true
});

并跟踪到错误消息。

jutyujz0

jutyujz02#

我同意另一个答案也可以,但是您可以使用allowExternalErrors作为debug的补充(或替代)。
请参阅文档以了解两者的说明。
如其中所述:
默认情况下,shield可确保不向客户端公开内部数据(如果不打算这样做)。因此,如果未使用错误 Package 指定,则执行期间引发的所有错误都会在“未授权!”错误消息中解决。通过将allowExternalErrors选项设置为true,可以关闭此功能。
这意味着在默认情况下,shield会报告一个401错误,即使发生了不同的错误。这意味着你会被引导去相信你有一个认证问题,而实际上是其他的问题。得到一个其他错误的认证错误可能不是一个好主意,即使是在你的网站上。
因此,包含选项allowExternalErrors: true将使错误消息更清楚:

const permissions = shield({
  Query: {
    users: allow,
  },
  Mutation: {
    login: allow,
  },
},
{
  allowExternalErrors: true
});

如果需要,还可以在开发中将debug设置为true。

相关问题