Laravel Dusk — как мне узнать, под каким именем зарегистрирован браузер?

У меня есть система Laravel, которая позволяет людям аутентифицироваться, щелкая URL-адрес, содержащий «токен» входа. Это облегчает удобный доступ на мобильных устройствах без необходимости управлять паролями.

Я создал модель с именем App\LoginTokens и маршрут web.php:

Route::get('/arbitraryprefix/{tokenCode}','LoginTokenController@loginWithTokenAndRedirect')

Этот метод контроллера проверяет токен и, если он действителен, регистрирует пользователя с помощью \Auth::loginUsingId($loginToken->user_id) и перенаправляет на URL-адрес токена $loginToken->url.

Очевидно, существуют и другие меры безопасности (включая истечение срока действия токена и правила, гарантирующие, что аутентифицируемый пользователь относится к одному конкретному классу, который не имеет большого доступа в системе.

Я пишу несколько тестовых случаев в Laravel Dusk и хочу проверить, что токен регистрирует человека как правильного пользователя.

Моя система работает на Laravel 5.4, поэтому я использую assertPathIs, поскольку assertUrlIs недоступно в 5.4, и это подтверждает, что я перенаправляюсь на правильный документ.

            $this->browse(function ($browser) use ($loginToken,$oneClientUser) {
                $browser->visit('/logout')
                ->waitForText('Login')
                ->visit($loginToken->getLoginAndRedirectUrl())
                ->waitForText($oneClientUser->name)// the users name shows in top right when they are logged in.
                ->assertPathIs(parse_url($loginToken->url,PHP_URL_PATH))
                ->visit('/logout')
                ->waitForText('Login');
            });

Я хочу связать с браузером вызов типа

$browser->assertUserIs($oneClientUser)

но мне пришлось довольствоваться проверкой их имени пользователя, которое отображается для аутентифицированных пользователей.

Есть ли способ проверить, какой пользователь аутентифицирован, как в обратном вызове $this->browse(function($browser){ --here--})?


person NULL pointer    schedule 06.11.2019    source источник


Ответы (1)


Да, есть: assertAuthenticatedAs()

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\User;

class AuthTestExample extends DuskTestCase
{
    use DatabaseMigrations;

    protected $user

    public function setUp(): void
    {
        parent::setUp();
        $this->user = factory(User::class)->create(['password' => bcrypt('password')]);
    }

    public function tearDown(): void
    {
        $this->browse(function (Browser $browser) { $browser->logout(); });
        parent::tearDown();
    }

    public function testLogin()
    {
        $this->browse(function (Browser $browser) {
            $browser->assertGuest()
                    ->visit('/login')
                    ->type('@login', $this->user->login)
                    ->type('@password', 'password')
                    ->click('@login-button')
                    ->assertPathIs('/dashboard')
                    ->assertAuthenticatedAs($this->user);
        });
    }
}
person IGP    schedule 06.11.2019
comment
Спасибо, IGP, это похоже на то, что я искал, НО это не работает... Я включил -›assertAuthenticatedAs($oneClientUser) в цепочке после моего вызова -›assertPathIs, и он возвращает Текущий аутентифицированный пользователь не тот, кого ожидали., и он говорит, что ist сравнивает NULL с моим $oneClientUser. - person NULL pointer; 06.11.2019
comment
Вы можете передать второй аргумент в assertAuthenticatedAs. Охрана. Может быть, это то, чего не хватает. - person IGP; 06.11.2019
comment
2-й параметр Guard является необязательным, по умолчанию равен NULL, но я согласен с вами - может потребоваться передать его, так как он используется: $response = $this-›visit(/_dusk/user/{$guard}); в методе currentUserInfo в свойстве InteractsWithAuthentication. посмотрю завтра - person NULL pointer; 06.11.2019