You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对自定义Strapi插件发起的请求进行身份验证?

问题描述

我有一个自定义Strapi插件,路由配置如下:

module.exports = [
  {
    method: "GET",
    path: "/export/:formToExport/:deleteAfterExport",
    handler: "myController.index",
    config: {
      policies: [],
    },
  },
];

后台页面点击按钮时调用以下函数请求该接口:

const handleDownload = async () => {
  try {
    const url = `/export-form-submissions/export/${encodeURIComponent(
      formToExport
    )}/${deleteAfterExport}`;
    const response = await fetch(url);

    //do more stuff
  } catch (err) {
    // 错误处理
  }
};

调用时返回401错误,只有在路由config中设置auth: false关闭认证才能正常请求。我不想关闭认证,只希望已登录的后台用户能访问该接口,请问如何在请求中携带登录会话信息实现这一点?

解决方案

完全可以通过在请求中携带Strapi后台的会话Cookie来实现,不需要关闭认证,具体步骤如下:

1. 配置路由的认证规则

首先确保路由启用后台会话认证,不需要设置auth: false,反而要明确配置认证模式(Strapi v4默认后台用session认证):

module.exports = [
  {
    method: "GET",
    path: "/export/:formToExport/:deleteAfterExport",
    handler: "myController.index",
    config: {
      policies: [],
      auth: {
        mode: 'session', // 使用后台的session认证机制
        scope: ['admin'] // 可选:限制仅管理员角色可访问,根据需求调整
      }
    },
  },
];

2. 修改fetch请求,携带会话Cookie

在handleDownload函数的fetch请求中添加credentials: 'include'选项,这样浏览器会自动带上当前登录用户的Strapi后台会话Cookie(比如strapi_jwt),让服务端验证用户身份:

const handleDownload = async () => {
  try {
    const url = `/export-form-submissions/export/${encodeURIComponent(
      formToExport
    )}/${deleteAfterExport}`;
    const response = await fetch(url, {
      credentials: 'include' // 关键:携带当前会话的Cookie
    });

    if (!response.ok) {
      throw new Error(`请求失败,状态码:${response.status}`);
    }

    // 后续下载逻辑示例(可根据你的需求调整)
    const blob = await response.blob();
    const downloadUrl = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = downloadUrl;
    link.download = `form-${formToExport}-export.csv`; // 自定义下载文件名
    document.body.appendChild(link);
    link.click();
    URL.revokeObjectURL(downloadUrl);
    document.body.removeChild(link);
  } catch (error) {
    console.error('下载失败:', error);
    // 这里可以添加前端错误提示,比如弹出通知告知用户
  }
};

补充说明

  • 该方案适用于Strapi v3和v4的后台插件场景,因为后台登录后会话信息会存在Cookie中,credentials: 'include'会让fetch自动携带这些Cookie。
  • 如果你的插件路由是挂载在/admin前缀下(Strapi插件默认行为),确保fetch的url路径正确即可,不需要额外调整Cookie的传递逻辑。

内容的提问来源于stack exchange,提问作者Chris Lau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:20:26