Laravel 11 Passport令牌请求超时,排查配置缺失问题
Laravel 11 Passport 认证系统 cURL 超时问题排查
问题描述
我正在使用Laravel 11搭建Passport认证系统,执行了以下操作:
- 执行安装命令:
php artisan install:api --passport - 创建密码授权客户端:
php artisan passport:client --password,按提示完成后生成客户端ID和密钥并配置到.env文件 - 在config/auth.php中配置api驱动为passport
- 在AppServiceProvider的boot方法中添加
Passport::enablePasswordGrant();
随后在api.php中编写/login路由,通过Http请求调用http://127.0.0.1:8000/oauth/token获取令牌,但使用Postman请求/api/login时出现错误:
cURL error 28: Operation timed out after 30006 milliseconds with 0 bytes received (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://127.0.0.1:8000/oauth/token
请问我的配置是否存在遗漏?
可能的原因及解决方法
1. 本地请求阻塞问题
如果使用php artisan serve启动单进程开发服务器,在Laravel内部通过Http客户端请求自身服务会导致请求阻塞超时。解决方式:
- 启动多进程开发服务器:
php artisan serve --workers=2 - 直接调用Passport内部逻辑生成令牌,无需请求外部端点,示例代码:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; Route::post('/login', function (Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (!Auth::attempt($credentials)) { return response()->json(['message' => '无效的登录凭证'], 401); } $user = Auth::user(); $token = $user->createToken('AuthToken'); return response()->json([ 'access_token' => $token->plainTextToken, 'token_type' => 'Bearer', 'expires_at' => $token->accessToken->expires_at->toDateTimeString(), ]); });
2. 服务地址或端口问题
- 确认Laravel开发服务器确实在
127.0.0.1:8000运行,无端口占用情况 - 若使用Valet、Homestead等环境,替换请求地址为对应域名(如
http://your-app.test/oauth/token)
3. 配置遗漏检查
- 确认
.env文件中PASSPORT_CLIENT_ID和PASSPORT_CLIENT_SECRET与生成的密码客户端信息完全一致 - 确认用户模型已引入
Laravel\Passport\HasApiTokenstrait:
use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; }
- 确认
config/auth.php中api guard配置正确:
'guards' => [ 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
4. cURL超时设置调整
在发起Http请求时手动缩短超时时间,避免无意义等待:
$response = Http::timeout(10)->post('http://127.0.0.1:8000/oauth/token', [ 'grant_type' => 'password', 'client_id' => env('PASSPORT_CLIENT_ID'), 'client_secret' => env('PASSPORT_CLIENT_SECRET'), 'username' => $request->email, 'password' => $request->password, 'scope' => '', ]);
内容的提问来源于stack exchange,提问作者Sidney Sousa
相关产品推荐
相关产品推荐

