Apiato PHP如何无需login token访问item endpoint
Apiato 框架下免登录访问指定发票接口实现方案
Apiato 默认对所有 API 接口挂载认证中间件,不需要修改全局认证逻辑,只需要针对发票预览接口单独做权限放开+安全加固即可,具体步骤如下:
1. 定义公开访问的预览路由
不要复用后台带权限校验的发票管理路由,单独在发票模块的 API 路由目录(路径一般为app/Containers/Invoices/UI/API/Routes/)下新建公开路由文件,例如GetInvoicePreview.v1.public.php,代码示例:
<?php use Illuminate\Support\Facades\Route; Route::get('invoices/public-preview/{signature}', [ 'uses' => [\App\Containers\Invoices\UI\API\Controllers\InvoiceController::class, 'getPublicPreview'], ]);
找到框架核心配置文件app/Ship/Configs/apiato.php,定位到skipAuthenticationRoutes配置项,将刚新增的路由加入免认证列表,注意格式为请求方法@路由路径:
'skipAuthenticationRoutes' => [ 'get@invoices/public-preview/{signature}', ],
配置后该路由会自动跳过默认的auth:api token校验,不需要携带登录凭证即可访问。
2. 加安全校验避免接口被恶意遍历
公开接口不能直接使用发票自增ID作为查询参数,否则攻击者遍历ID即可爬取全量发票数据,需要做两层防护:
- 给发票表新增
preview_signature字段,类型为varchar(64),每张发票生成时同步生成32位以上的随机唯一字符串存入该字段,作为公开访问的唯一凭证 - 接口逻辑中仅根据传入的
signature参数查询对应发票,不接收自增ID参数;查询结果仅返回预览所需的必要字段:发票抬头、金额、开票项目、付款状态、付款指引,过滤掉内部备注、操作日志、商户敏感信息等非公开内容
3. 配置QR码生成规则
生成纸质发票的QR码时,直接拼接公开接口的完整访问地址即可,示例:https://你的业务域名/api/v1/invoices/public-preview/[对应发票的preview_signature]
将该字符串生成QR码印刷在发票上,用户扫码即可直接跳转访问,无需登录。
可选优化项
- 给公开接口挂载限流中间件
throttle:30,1,单IP每分钟最多访问30次,避免恶意刷接口 - 可给预览链接增加有效期校验,例如发票开出超过180天后接口直接返回404,链接失效
- 接口返回头增加
X-Robots-Tag: noindex,避免搜索引擎爬取公开的发票页面
内容的提问来源于stack exchange,提问作者Mochi
相关产品推荐
相关产品推荐

