【发布时间】:2020-01-20 20:54:45
【问题描述】:
我正在尝试为 Laravel Passport 的注销过程编写一个测试。但每次我运行它时,我都会收到错误expected 401 but got 200,这意味着它实际上并没有注销用户。
AuthController中的Logout功能如下;
public function logout(Request $request): JsonResponse
{
$accessToken = $request->user()->token();
$refreshToken = DB::table('oauth_refresh_tokens')
->where('access_token_id', $accessToken->id)
->update([
'revoked' => true
]);
$accessToken->revoke();
return response()->json(['message' => 'Successfully logged out']);
}
这工作正常,但测试是问题。
我的测试如下;
public function testUserIsLoggedOutProperly(): void
{
$user = factory(User::class)->create();
Passport::actingAs($user);
$this->json('GET', 'api/user')->assertStatus(JsonResponse::HTTP_OK);
$this->json('GET', 'api/logout')->assertStatus(JsonResponse::HTTP_OK);
$this->json('GET', 'api/user')
->assertStatus(JsonResponse::HTTP_UNAUTHORIZED);
}
最后一个断言实际上是返回一个 HTTP_OK (200)
任何帮助将不胜感激。
【问题讨论】:
-
我不确定我是否跟随。 Passport 用于向应用程序添加 OAuth 身份验证。 OAuth 是无状态的;您使用令牌发出请求,并且请求已通过身份验证或未通过身份验证。没有“退出”的概念。如果您撤销了某个令牌,这仅意味着您将无法再使用该特定令牌发出任何请求。
-
@MartinBean ... 是的,没错,但是 api/user 路由是受保护的,所以在测试中撤销令牌应该会导致最后一次获取请求的 401 对吗?
-
Passport 的
actingAs方法模拟令牌,因此您实际上并没有使用令牌实例:github.com/laravel/passport/blob/…。您可能需要在测试数据库中创建并使用真实令牌进行身份验证,并进行测试撤销以阻止您查看受保护的路由。
标签: php laravel laravel-passport