如何以经过身份验证的用户身份使用 GraphQL 查询 Strapi 后端?

How to query a Strapi backend using GraphQL as an authenticated user?

目前,我只能 运行 作为 public 用户进行查询,Strapi 会为我获取结果。但是,我想完全阻止对 public 用户的所有查询访问,只允许经过身份验证的用户(最好只允许一个特定用户)。

我知道我可以在 角色和权限 插件中阻止查询访问,我也知道可以在 中使用自己的密码创建一个新用户] 内容类型 -> 用户 屏幕。其实我已经有了,叫web。现在,如何以该特定用户身份在我的 /graphql/ 端点中执行查询?

GraphQL 端点不是通过 route 管理的,而是通过中间件管理的。 所以政策系统没有应用。

您将无法删除对此端点的访问权限。 但是您可以通过更新 GraphQL 配置文件来禁用 GraphQL Playground GET /graphql。这是执行此操作的文档 https://strapi.io/documentation/3.0.0-beta.x/guides/graphql.html#configurations

如果你想限制对 GraphQL 端点的访问,我建议你创建一个新的中间件,它将检查触发的端点是否 /graphql 并检查经过身份验证的用户是否是你想要的。

这是创建中间件的文档https://strapi.io/documentation/3.0.0-beta.x/advanced/middlewares.html

你的中间件看起来像那样

module.exports = strapi => {
  return {
    initialize() {
      strapi.app.use(async (ctx, next) => {
        const handleErrors = (ctx, err = undefined, type) => {
          if (ctx.request.graphql === null) {
            return (ctx.request.graphql = strapi.errors[type](err));
          }

          return ctx[type](err);
        };

        // check if it's a graphql request
        if (ctx.request.url === '/graphql' && ctx.request.method === 'POST') {
          if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
            try {
              // get token data
              const { id } = await strapi.plugins[
                'users-permissions'
              ].services.jwt.getToken(ctx);

              if (id === undefined) {
                throw new Error('Invalid token: Token did not contain required fields');
              }

              // check if the id match to the user you want
              if (id !== 'my-user-id') {
                return handleErrors(ctx, 'You are not authorized to access to the GraphQL API', 'unauthorized');
              }
            } catch (err) {
              return handleErrors(ctx, err, 'unauthorized');
            }
          } else {
            // if no authenticated, return an error
            return handleErrors(ctx, 'You need to be authenticated to request GraphQL API', 'unauthorized');
          }
        }

        await next();
      });
    }
  };
};

此代码将限制 my-user-id 访问您的 GraphQL API。

要进行身份验证,您必须在 header 中发送 JWT。请按照此处的文档了解它 https://strapi.io/documentation/3.0.0-beta.x/guides/authentication.html