Authenticate.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\miniapi\middleware;
  4. use Webman\Http\Request;
  5. use Webman\Http\Response;
  6. use Webman\MiddlewareInterface;
  7. use app\miniapi\auth\TokenVerifier;
  8. use app\miniapi\exception\ApiException;
  9. final class Authenticate implements MiddlewareInterface
  10. {
  11. public function process(Request $request, callable $handler): Response
  12. {
  13. $request->miniPrincipal = null;
  14. $header = (string) $request->header('authorization', '');
  15. if (!preg_match('/^Bearer ([A-Za-z0-9._~+\/-]{1,4096}=*)$/D', $header, $match) || strlen($header) > 4103) {
  16. throw new ApiException(40101, '请先登录', 401);
  17. }
  18. $class = config('mini_api.token_verifier');
  19. if (!$class) {
  20. throw new ApiException(50301, '小程序登录服务尚未接入', 503);
  21. }
  22. if (!is_string($class) || !is_subclass_of($class, TokenVerifier::class)) {
  23. throw new \LogicException('Invalid mini API token verifier');
  24. }
  25. $request->miniPrincipal = (new $class())->verify($match[1]);
  26. if (config('mini_protection.enabled', false)) {
  27. (new \app\miniapi\protection\TrafficGuard())->check(
  28. 'account',
  29. $request->miniPrincipal->userId,
  30. \app\miniapi\protection\RequestProfile::endpoint($request),
  31. $request->miniListCost ?? \app\miniapi\protection\RequestProfile::listCost($request),
  32. \app\miniapi\http\ApiResponse::requestId($request)
  33. );
  34. }
  35. return $handler($request);
  36. }
  37. }