45 lines
1.5 KiB
PHP
45 lines
1.5 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Middleware;
|
||
|
||
use App\Exceptions\PlayerAuthenticationException;
|
||
use App\Lottery\ErrorCode;
|
||
use App\Services\PlayerTokenResolver;
|
||
use App\Support\ApiResponse;
|
||
use App\Support\LotteryMessage;
|
||
use Closure;
|
||
use Illuminate\Http\Request;
|
||
use Symfony\Component\HttpFoundation\Response;
|
||
|
||
/**
|
||
* 【玩家端 API 鉴权中间件】
|
||
*
|
||
* - 成功:解析 Bearer → Player,写入 request attribute `lottery_player`。
|
||
* - 失败:直接 JSON 返回,不进入控制器;其中 msg 经由 LotteryMessage::sso() 按请求语言翻译
|
||
* (依赖前置的 NegotiateLotteryLocale),code 为 {@see ErrorCode} 中玩家鉴权段。
|
||
*
|
||
* PlayerAuthenticationException 的 getMessage() 仅作开发与日志用语,可与 API msg 语种不一致。
|
||
*/
|
||
class EnsurePlayerApi
|
||
{
|
||
public function handle(Request $request, Closure $next): Response
|
||
{
|
||
try {
|
||
$player = app(PlayerTokenResolver::class)->resolve($request);
|
||
} catch (PlayerAuthenticationException $e) {
|
||
// msg:多语言用户提示;code / httpStatus:仍来自异常内业务定义
|
||
return ApiResponse::error(
|
||
LotteryMessage::sso($request, $e->lotteryCode),
|
||
$e->lotteryCode,
|
||
null,
|
||
$e->httpStatus,
|
||
);
|
||
}
|
||
|
||
// 使用 attributes,避免与 Laravel 内置 input 混淆
|
||
$request->attributes->set('lottery_player', $player);
|
||
|
||
return $next($request);
|
||
}
|
||
}
|