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
相关产品推荐
相关产品推荐

