$asUsername]); if ($account === null) { throw new InvalidArgumentException("Cannot find account with username \"{$asUsername}\""); } $token = Yii::$app->tokensFactory->createForWebAccount($account); $this->amBearerAuthenticated($token->toString()); return $account->id; } /** * Requests a new ALTCHA challenge and solves it like the client side does * * @return string the payload to be passed as the captcha value */ public function solveAltchaChallenge(): string { $this->sendGET('/api/captcha/altcha/challenge'); $this->seeResponseCodeIs(200); /** @var array $data */ $data = json_decode($this->grabResponse(), true, flags: JSON_THROW_ON_ERROR); $challenge = Challenge::fromArray($data); // Solving doesn't need the secrets $solution = (new AltchaLib())->solveChallenge(new SolveChallengeOptions($challenge, new Pbkdf2())); $this->assertNotNull($solution, 'Unable to solve the ALTCHA challenge'); return (new Payload($challenge, $solution))->toBase64(); } public function notLoggedIn(): void { $this->haveHttpHeader('Authorization', ''); Yii::$app->user->logout(); } public function canSeeAuthCredentials($expectRefreshToken = false): void { $this->canSeeResponseJsonMatchesJsonPath('$.access_token'); $this->canSeeResponseJsonMatchesJsonPath('$.expires_in'); if ($expectRefreshToken) { $this->canSeeResponseJsonMatchesJsonPath('$.refresh_token'); } else { $this->cantSeeResponseJsonMatchesJsonPath('$.refresh_token'); } } }