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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:48:03