任务时间: 2025年06月15日 20:00-20:15
任务类型: Bug修复
模块: ThirdParty、AppGame、URS
用户反馈URS login4u功能存在认证凭证获取问题,系统提示"服务 urs 没有可用的认证凭证",但实际数据库中存在有效的认证凭证。
通过日志分析发现以下问题:
production 环境的认证凭证,但数据库中只有 testing 环境的凭证service.config 获取凭证,但应该从 credential 获取thirdparty_logs 表的 method 字段长度不够存储 PACKAGE_CALLThirdPartyCredential 模型缺少 $fillable 属性定义System\Services\User 类命名空间不匹配handler 方法签名与基类不兼容setLoginTime() 方法修改 BaseRequest::getSmartCredential() 方法,实现智能环境匹配:
protected function getSmartCredential(): ?ThirdPartyCredential
{
$appEnv = app()->environment();
// 环境映射:将Laravel环境映射到凭证环境
$envMapping = [
'local' => 'testing',
'development' => 'testing',
'testing' => 'testing',
'staging' => 'staging',
'production' => 'production',
];
$preferredEnv = $envMapping[$appEnv] ?? 'production';
// 按优先级尝试获取凭证
$environments = [$preferredEnv, 'testing', 'production'];
$environments = array_unique($environments);
foreach ($environments as $env) {
$credential = $this->service->getActiveCredential($env);
if ($credential) {
return $credential;
}
}
// 如果以上都没找到,尝试获取任何可用的激活凭证
return $this->service->credentials()
->where('is_active', true)
->where(function ($query) {
$query->whereNull('expires_at')
->orWhere('expires_at', '>', now());
})
->first();
}
修改 URS\Request\BaseRequest::getUrsCredential() 方法:
protected function getUrsCredential(): \ThirdParty\Urs\Dto\Credential
{
// 从认证凭证中获取凭证信息,而不是从服务配置
$credentials = $this->getCredential()->getDecryptedCredentials();
return \ThirdParty\Urs\Dto\Credential::fromArray($credentials);
}
ALTER TABLE kku_thirdparty_logs MODIFY COLUMN method VARCHAR(20) NOT NULL;
为 ThirdPartyCredential 模型添加 $fillable 属性:
// attrlist start
protected $fillable = [
'service_id',
'name',
'type',
'credentials',
'environment',
'is_active',
'expires_at',
'last_used_at',
'usage_count',
];
// attrlist end
修正 BaseRequest 中的配额检查方法:
protected function checkQuota(): bool
{
return QuotaService::canUse($this->service->id);
}
protected function updateQuota(): void
{
QuotaService::use($this->service->id);
}
System\Services\User 类命名空间handler 方法签名使用测试命令验证修复效果:
php artisan test:login4u '$2y$10$i.h97m13olfIaU.ZTYiyeeXFl8xqn48w2bFiAhcoQsJdU6K3w.Lgu'
测试结果:
=== 测试URS Login4u功能 ===
1. 检查Handler类...
✓ Login4uHandler类存在
2. 检查Protobuf类...
✓ RequestPublicLogin4u类存在
✓ ResponsePublicLogin4u类存在
3. 检查URS服务...
✓ UrsService类存在
4. 检查UrsUserMappingService...
✓ UrsUserMappingService类存在
5. 创建测试请求...
✓ 测试请求创建成功,keylogin: $2y$10$i.h97m13olfIaU.ZTYiyeeXFl8xqn48w2bFiAhcoQsJdU6K3w.Lgu
6. 测试Handler处理...
开始处理登录请求...
7. 检查响应结果...
✓ 登录成功!
Token: 76fd26e5eb718a9d0c504fbf5c0bdb3a
IsProhibit: false
最后登录时间: 2025-06-15 20:12:35
=== 测试完成 ===
本次修复解决了URS login4u功能的核心认证问题,实现了:
修复后的系统能够稳定处理URS login4u登录请求,为用户提供无缝的登录体验。