如何对自定义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
相关产品推荐
相关产品推荐

