Laravel 9 Passport生成API令牌遇密钥读写错误求助
问题描述
在Laravel 9中通过Postman调用API创建令牌时,出现以下错误:LogicException: Unable to read key from file file://C:\Users\vivek\pregent-app\app\Providers/../secrets/oauth\oauth-private.key in file C:\Users\vivek\pregent-app\vendor\league\oauth2-ser
尝试执行php artisan passport:keys生成密钥时,触发新错误:file_put_contents(C:\Users\vivek\pregent-app\app\Providers/../secrets/oauth\oauth-public.key): Failed to open stream: No such file or directory
执行php artisan config:cache清理缓存后问题仍未解决,完整错误堆栈如下:
file_put_contents(C:\Users\vivek\pregent-app\app\Providers/../secrets/oauth\oauth-public.key): Failed to open stream: No such file or directory
at C:\Users\vivek\pregent-app\vendor\laravel\passport\src\Console\KeysCommand.php:54
50▕ file_put_contents($privateKey, Arr::get($keys, 'privatekey'));
51▕ } else {
52▕ $key = RSA::createKey($this->input ? (int) $this->option('length') : 4096);
53▕
➜ 54▕ file_put_contents($publicKey, (string) $key->getPublicKey());
55▕ file_put_contents($privateKey, (string) $key);
56▕ }
57▕
58▕ $this->info('Encryption keys generated successfully.');1 C:\Users\vivek\pregent-app\vendor\laravel\passport\src\Console\KeysCommand.php:54
file_put_contents()2 C:\Users\vivek\pregent-app\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:36
Laravel\Passport\Console\KeysCommand::handle()
解决方案
1. 手动创建密钥存储目录
错误核心是Passport命令不会自动创建不存在的密钥存储目录,需手动生成:
- 进入项目根目录下的
app文件夹,创建secrets文件夹,再在其中创建oauth子文件夹 - 或直接通过Windows命令行创建:
mkdir "C:\Users\vivek\pregent-app\app\secrets\oauth"
2. 配置目录权限
确保当前用户及Web服务器进程(如IIS的IIS_IUSRS用户)对app/secrets/oauth目录拥有读写权限:
Windows系统右键目录→属性→安全→编辑,添加对应用户并勾选读写权限。
3. 重新生成Passport密钥
执行以下命令生成密钥:
php artisan passport:keys
如需自定义密钥长度,可添加参数:
php artisan passport:keys --length=2048
4. 验证密钥生成结果
检查app/secrets/oauth目录下是否生成oauth-private.key和oauth-public.key两个文件。
5. 清除配置缓存
之前使用的config:cache是缓存配置,需执行清除命令:
php artisan config:clear
6. 重新测试API调用
再次通过Postman调用API创建令牌,验证问题是否解决。
内容的提问来源于stack exchange,提问作者vivek kn

