当前位置: 首页 > 知识库问答 >
问题:

注销/撤销令牌的Laravel Passport单元测试

长孙泉
2023-03-14

我正在使用Laravel Passport,并且在控制器中具有注销功能。见下文:

public function logout(Request $request){
    auth()->user()->token()->revoke();
    $response = ['message' => 'You have been successfully logged out!'];
    return response($response, 200);
}

我现在试图为此编写一个单元测试,但是即使在注销和令牌被撤销后,用户仍然保持登录状态。我发现此方法照明\Auth\ResestGuard::注销不存在Laravel Passport,但即使此解决方案也不适用于我。我猜这可能是因为我正在使用Laravel 8。我的单元测试是这样的:

public function testLogout()
{
    //Random email and password
    $email = $this->faker->email;
    $password = $this->faker->password(8);

    //Create a user
    $this->createUser($this->faker->name, $email, $password);

    //Data for the post request
    $data = [
        'email' => $email,
        'password' => $password
    ];

    //Try login
    $response = $this->json('POST','api/login', $data);
    //Assert it was successful
    $response->assertStatus(200);

    //Assert we received a token
    $this->assertArrayHasKey('token', $response->json());

    //Get the token
    $token = $response->json()['token'];

    //Setup authenticated header
    $header = [
        'Authorization' => 'Bearer '.$token
    ];
    //try to access authenticated route
    $response = $this->json('get', 'api/ads', [], $header);
    //Assert it was successful
    $response->assertStatus(200);

    $this->resetAuth();
    //Logout the user
    $response = $this->post('api/logout', [], $header);
    //Assert it was successful
    $response->assertStatus(200);

    //try to access authenticated route
    $response = $this->json('get', 'api/ads', [], $header);
    //Assert it returns unathorized error
    $response->assertStatus(401);


    //Delete the user
    User::where('email', $email)->delete();

}

结果如下:

预期状态代码401,但收到200。断言401与200相同失败。

共有2个答案

颛孙镜
2023-03-14

您的注销方法看起来很奇怪。我会这么做

use Illuminate\Support\Facades\Auth;

// ... other controller methods

public function logout(Request $request)
{
  Auth::logout();
  $request->session()->invalidate();
  $request->session()->regenerateToken();

  // ...do a redirect or other stuff
}

注销。这将正确注销用户。这也是Laravel文件中提出的方法。

要从Laravel Passport注销,您可以运行

if (Auth::check()) {
  Auth::user()->token()->revoke();
}

撤消当前使用的令牌。这肯定会让用户从其请求注销的当前设备注销。

确保在路由/网络中。php您的注销路径位于组(['middleware'=

澹台啸
2023-03-14

你在一次测试中做得太多了。但除此之外,我无法在代码中发现任何问题。但这对我起了作用:

class LogoutController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api');
    }

    public function logout()
    {
        Auth::user()->token()->revoke();
        $tokenId = Auth::user()->token()->id;

        $refreshTokenRepository = app('Laravel\Passport\RefreshTokenRepository');
        $refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);

        return response(null, Response::HTTP_NO_CONTENT);
    }
}

测试可以简单地执行以下操作:

public function testAnAuthenticatedUserCanLogout()
{
    $user = User::factory()->create();

    Passport::actingAs($user);

    $this->postJson('/api/logout')
        ->assertNoContent();
}
 类似资料:
  • 当我想要注销时,我调用以下代码: 怎么修?

  • 正如这里提到的http://projects.spring.io/spring-security-oauth/docs/oauth2.html,撤销是通过刷新令牌完成的。但这似乎不起作用。

  • 我使用Keycloak来保护我的react前端和Node.js后端。这些客户端使用基于角色的授权进行保护。 我尝试这个endpoint来撤消用户访问令牌。但不起作用/auth/admin/realms//users/ 是否有方法在Keycloak中撤销特定用户的访问令牌?

  • 目前只有 刷卡支付 有此功能。 调用支付接口后请勿立即调用撤销订单API,建议支付后至少15s后再调用撤销订单接口。 通过内部订单号撤销订单 $app->reverse->byOutTradeNumber("商户系统内部的订单号(out_trade_no)"); 通过微信订单号撤销订单 $app->reverse->byTransactionId("微信的订单号(transaction_id)"

  • 说明 微信支付撤销订单SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_11&index=3 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\Reverse\Request 属性 名称 类型 说明 $_apiMethod string 接口名称 $transaction_id s

  • 在我的AD B2C应用程序中,我需要撤销AD B2C为一个用户给出的所有刷新令牌。当用户帐户登录多个应用程序,并且在一个应用程序中用户更改了密码时,这是一个需要实现的要求。当密码被更改时,我已经撤销了他给其他应用程序的所有刷新令牌。怎么做? 更新: 我尝试过以下操作, 解决方案: 刷新令牌撤销图形api正在工作。但这需要大约5分钟。 但这里的问题是在等待期间,我能够获得新的刷新令牌和访问令牌,并且