我有一个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上,因此在5.4中不可用的情况下,我将assertPathIs
用作assertUrlIs
,这确认我重定向到了正确的文档。
$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--})
回调中对哪个用户进行了身份验证?
答案 0 :(得分:0)
是的,有: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);
});
}
}