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