如何以经过身份验证的用户身份使用 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
目前,我只能 运行 作为 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