| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- <?php
- declare(strict_types=1);
- namespace app\miniapi\controller;
- use support\Request;
- use support\Response;
- use support\annotation\route\DisableDefaultRoute;
- use app\miniapi\http\ClientIp;
- use app\miniapi\http\Input;
- use app\miniapi\service\AuthService;
- use app\miniapi\auth\LoginThrottle;
- use app\miniapi\service\TestPhoneLogin;
- use app\miniapi\service\SmsLogin;
- #[DisableDefaultRoute]
- final class AuthController extends BaseController
- {
- public function login(Request $request): Response
- {
- // ClientIp ignores the header unless the TCP peer is a configured proxy, so an
- // untrusted caller still cannot forge an address to bypass login throttling.
- (new LoginThrottle())->consume(ClientIp::resolve($request));
- return $this->success($request, (new AuthService())->login(Input::json($request)));
- }
- public function logout(Request $request): Response
- {
- return $this->success($request, (new AuthService())->logout(substr($request->header('authorization'), 7)));
- }
- public function sendSms(Request $request): Response
- {
- // Throttled like the other login entry points: one caller must not be able to
- // spend the SMS balance of the whole account.
- (new LoginThrottle())->consume(ClientIp::resolve($request));
- return $this->success($request, (new SmsLogin())->sendCode(Input::json($request), ClientIp::resolve($request)));
- }
- public function phoneLogin(Request $request): Response
- {
- (new LoginThrottle())->consume(ClientIp::resolve($request));
- return $this->success($request, (new SmsLogin())->login(Input::json($request)));
- }
- public function testPhone(Request $request): Response
- {
- // Throttling and the source allowlist must judge the same caller; sharing one
- // resolved address here is what keeps a local proxy from opening this endpoint.
- $source = ClientIp::resolve($request);
- (new LoginThrottle())->consume($source);
- $login = new TestPhoneLogin();
- $login->assertSourceAllowed($source);
- return $this->success($request, $login->login(Input::json($request)));
- }
- }
|