Laravel测试:如何验证SPA用户登出后的登录状态
测试SPA登出API的方案
针对SPA的Token认证场景,assertGuest()是基于Session校验的,确实没法直接用,你可以从以下两个维度验证登出操作是否生效:
1. 验证当前AccessToken已被删除
先创建用户并生成有效Token,调用登出接口后,直接检查数据库中对应用户的该AccessToken是否已被移除:
public function test_logout_deletes_current_access_token() { $user = User::factory()->create(); $token = $user->createToken('test-spa-token')->plainTextToken; // 携带Token调用登出接口 $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $token, ])->post('/api/logout'); $response->assertStatus(200); // 验证数据库中该Token记录已消失 $this->assertDatabaseMissing('personal_access_tokens', [ 'tokenable_id' => $user->id, 'name' => 'test-spa-token', ]); }
2. 验证旧Token无法访问受保护接口
登出完成后,用原来的Token请求一个需要认证的接口,应该返回401未授权状态:
public function test_logout_revokes_token_permission() { $user = User::factory()->create(); $token = $user->createToken('test-spa-token')->plainTextToken; // 执行登出操作 $this->withHeaders([ 'Authorization' => 'Bearer ' . $token, ])->post('/api/logout'); // 尝试用旧Token调用用户信息接口 $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $token, ])->get('/api/user'); $response->assertStatus(401); }
这两种验证方式结合,既能确认Token被物理删除,又能验证旧Token彻底失去权限,完全覆盖登出操作的有效性校验。
内容的提问来源于stack exchange,提问作者Muhammad Naveed
相关产品推荐
相关产品推荐

