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

Laravel 5.6如何实现含登录注册在内全路由的静态Token鉴权

实现Laravel 5.6 API全局静态Token验证方案

嘿,我明白你的需求——给所有API路由(包括登录、注册这种原本开放的接口)加上静态Token验证,确保只有持有合法Token的移动端才能访问。既然你已经集成了Passport,我们可以基于Laravel的中间件机制来实现这个需求,不用改动Passport的核心逻辑,具体步骤如下:

1. 搭建静态Token存储表

首先得有个地方存你的静态Token,我们新建一张表来管理:

php artisan make:migration create_static_api_tokens_table

打开生成的迁移文件,添加字段:

public function up()
{
    Schema::create('static_api_tokens', function (Blueprint $table) {
        $table->increments('id');
        $table->string('token')->unique(); // 存加密后的Token
        $table->string('name')->comment('标记Token所属客户端,比如"iOS v2.0"');
        $table->boolean('is_active')->default(true);
        $table->timestamps();
    });
}

运行迁移创建表:

php artisan migrate

2. 生成并加密静态Token

接下来生成一个原始Token,加密后存入数据库。你可以用Tinker快速生成:

php artisan tinker

在Tinker里执行:

use Illuminate\Support\Str;
use Illuminate\Support\Facades\Crypt;
use App\Models\StaticApiToken;

// 生成60位随机字符串作为原始Token
$rawToken = Str::random(60);
// 用Laravel自带加密工具加密
$encryptedToken = Crypt::encryptString($rawToken);

// 存入数据库
StaticApiToken::create([
    'token' => $encryptedToken,
    'name' => 'Mobile Client'
]);

把生成的$rawToken发给移动端开发,让他们存在客户端本地,请求API时在Header里带上。

3. 编写自定义验证中间件

我们需要一个中间件来校验请求里的静态Token是否合法:

php artisan make:middleware VerifyStaticToken

打开app/Http/Middleware/VerifyStaticToken.php,修改handle方法:

public function handle(Request $request, Closure $next)
{
    // 从自定义Header获取静态Token(避免和Passport的Authorization头冲突)
    $staticToken = $request->header('X-Static-Token');
    
    if (!$staticToken) {
        return response()->json(['message' => '请提供静态访问Token'], 401);
    }

    try {
        // 解密Token
        $decryptedToken = Crypt::decryptString($staticToken);
        
        // 查找数据库中有效的Token
        $validToken = \App\Models\StaticApiToken::where('token', $decryptedToken)
            ->where('is_active', true)
            ->first();
            
        if (!$validToken) {
            return response()->json(['message' => '无效的静态Token'], 401);
        }
    } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
        // 解密失败,说明Token格式不对或被篡改
        return response()->json(['message' => '无效的静态Token'], 401);
    }

    return $next($request);
}

这里用X-Static-Token作为Header字段,和Passport默认的Authorization头区分开,避免后续用户登录后的Token冲突。

4. 注册中间件

把这个中间件加到路由中间件列表里,打开app/Http/Kernel.php,在$routeMiddleware数组里添加:

protected $routeMiddleware = [
    // ... 其他中间件
    'static.token' => \App\Http\Middleware\VerifyStaticToken::class,
];

5. 给所有API路由应用全局验证

修改routes/api.php,把所有路由包裹在static.token中间件组里,如果有需要用户登录后才能访问的接口,可以叠加Passport的auth:api中间件:

// 所有API接口都先过静态Token验证
Route::middleware('static.token')->group(function () {
    // 开放的登录、注册接口(现在也需要静态Token才能访问)
    Route::post('login', 'Auth\LoginController@login');
    Route::post('register', 'Auth\RegisterController@register');

    // 需要用户登录的接口,叠加Passport的auth:api中间件
    Route::middleware('auth:api')->group(function () {
        Route::get('user', function (Request $request) {
            return $request->user();
        });
        // 你的其他业务路由...
    });
});

6. 测试验证

现在用Postman测试:

  • 不带X-Static-Token请求登录接口,会返回401
  • 带上正确的静态Token,就能正常调用登录/注册接口
  • 登录成功后拿到Passport的用户Token,调用需要auth:api的接口时,同时在Header里带上X-Static-Token和Authorization: Bearer {用户Token}即可

一些补充建议

  • 可以给不同的客户端分配不同的静态Token,方便后续排查问题或禁用某个客户端的访问权限
  • 定期更新静态Token,更新后把旧Token标记为is_active=false,提升安全性
  • 确保.env里的APP_KEY不泄露,因为Laravel的加密依赖这个密钥,泄露后别人可以解密你的Token

内容的提问来源于stack exchange,提问作者Code Lover

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:35:37