【问题标题】:Laravel Passport logout test returning 200 when it should be deniedLaravel Passport 注销测试在应该被拒绝时返回 200
【发布时间】: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


【解决方案1】:

这只是一个快速反应(未经测试),但您应该使用以下方法进行测试:

  1. 获得一个新的令牌,(我认为你可以在没有 api 调用的情况下做到这一点)
  2. 使用令牌进入 1) 调用“api/logout”
  3. 用 assertDatabaseHas 函数检查

    $response = $this->json('POST','oauth/token', [
        'form_params' => [
           'grant_type' => 'password',
           'client_id' => 'client-id',
           'client_secret' => 'client-secret',
           'username' => 'taylor@laravel.com',
           'password' => 'my-password',
           'scope' => '',
        ] 
    ]);
    $response->assertStatus(JsonResponse::HTTP_OK);
    $token = json_decode((string) $response->getBody(), true)['access_token'];
    
    $this->json('POST', 'api/logout')->withHeaders([
        'Accept' => 'application/json',
        'Authorization' => 'Bearer ' . $token  
    ])->assertStatus(JsonResponse::HTTP_OK);
    
    $this->assertDatabaseHas('oauth_refresh_tokens', [
      'access_token_id' => $token, 
      'revoked' => true
    ]);
    

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 2020-10-02
    • 2021-04-27
    • 2016-01-21
    • 1970-01-01
    • 2015-01-06
    • 2021-02-05
    • 2020-04-02
    • 2021-09-07
    相关资源
    最近更新 更多