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))); } }