使用Dingo API时如何自定义Laravel的auth:api中间件校验特定bearer token?
基于Dingo API实现自定义Bearer Token校验中间件完整步骤
1. 创建自定义认证驱动类
首先在项目中新建自定义认证提供者类,比如路径为app/Api/Auth/CustomBearerTokenProvider.php,代码实现如下:
<?php namespace App\Api\Auth; use Dingo\Api\Auth\Provider\Authorization; use Dingo\Api\Routing\Route; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; class CustomBearerTokenProvider extends Authorization { // 定义认证方式标识 public function getAuthorizationMethod() { return 'bearer'; } // 核心认证逻辑 public function authenticate(Request $request, Route $route) { // 从请求头提取Authorization值 $header = $request->header('Authorization'); if (!$header || !str_starts_with($header, 'Bearer ')) { throw new UnauthorizedHttpException('Bearer', '缺少合法的认证凭证'); } // 提取token值 $requestToken = trim(substr($header, 7)); // 从配置读取合法token列表,支持多token用逗号分隔 $allowedTokens = explode(',', env('API_ALLOWED_BEARER_TOKENS', '')); $allowedTokens = array_filter(array_map('trim', $allowedTokens)); if (!in_array($requestToken, $allowedTokens)) { throw new UnauthorizedHttpException('Bearer', '认证凭证无效'); } // 校验通过可返回任意非false值,Dingo会将其存入请求的auth属性中 return true; } }
2. 注册自定义认证驱动
打开Dingo API的配置文件config/api.php,找到auth配置项,新增自定义驱动:
'auth' => [ // 保留你原有其他认证驱动 'custom_bearer' => function ($app) { return new \App\Api\Auth\CustomBearerTokenProvider($app['request']); }, ],
3. 配置合法token
在项目根目录的.env文件中添加配置,多个合法token用英文逗号分隔:
API_ALLOWED_BEARER_TOKENS=token1,token2,token3
4. 接口使用认证
在Dingo路由定义中指定使用该认证驱动即可实现接口保护,仅携带合法Bearer token的请求会被放行:
// 所有该分组下的接口都会校验自定义Bearer token $api->group([ 'middleware' => 'api.auth', 'auth' => 'custom_bearer' ], function ($api) { // 你的接口定义 $api->get('test', function () { return '认证通过'; }); });
注意事项
- 如果需要允许部分接口免认证,直接将接口定义在上述分组外即可
- 生产环境禁止将token硬编码在代码中,建议存放在.env或者配置中心
- 跨域场景下需要在跨域配置中放行
Authorization请求头,否则前端携带的认证头会被浏览器拦截
内容的提问来源于stack exchange,提问作者sb0321
相关产品推荐
相关产品推荐

