【问题标题】:Testing log out with Laravel Passport使用 Laravel Passport 测试注销
【发布时间】:2019-05-09 08:27:00
【问题描述】:

我正在尝试弄清楚如何测试我的 Passport 驱动的注销功能,如下所示:

public function logout() {
        $accessToken = auth()->user()->token();

        $refreshToken = DB::table('oauth_refresh_tokens')
            ->where('access_token_id', $accessToken->id)
            ->update([
                'revoked' => true
            ]);

        $accessToken->revoke();

        return response()->json(['status' => 200]);
    }

我在设置响应时使用 Passport 代理助手。

    Passport::actingAs(
            $user,
            ['read write']
        );
$response = $this->post('/logout')
                ->assertStatus(200);

测试失败,因为代码给出了 500 错误,因为 auth()->user()->token() 是……空的?例如$accessToken->id为0,不应该是0,表示代码失败。

我不确定这是否是预期的行为,因为 Passport 的 actuatorAs 助手如何工作并且我无法实际测试注销功能,或者我的注销功能是否有问题。哈!

我的路线:

Route::post('login', 'Auth\LoginController@login');

Route::group(['middleware' => 'auth:api'], function() {
    Route::post('logout', 'Auth\LoginController@logout');
});

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

JsonApi::register('v1', ['namespace' => 'Api'], function (Api $api, $router) {
    $api->resource('training-locations');
    $api->resource('courses');
});

ETA:我的登录功能,如果有用的话:

public function login(Request $request, Client $client){
        $this->validateLogin($request);

        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        $response = $client->post(config('app.url') . '/oauth/token', [
            'form_params' => [
                'client_id' => config('auth.proxy.client_id'),
                'client_secret' => config('auth.proxy.client_secret'),
                'grant_type' => config('auth.proxy.grant_type'),
                'username' => $request->email,
                'password' => $request->password,
                'scopes' => '[read write]'
            ]
        ]);

        if ($response->getStatusCode() === 200) {
            $this->clearLoginAttempts($request);

           return response($response->getBody()->getContents(), $response->getStatusCode());
        }

        $this->incrementLoginAttempts($request);

        return response($response->getBody()->getContents(), $response->getStatusCode());
    }

为了调查这是否真的是一个问题,我尝试通过 Postman 访问端点。它进入函数,但找不到auth()->user()。我使用相同的路由组尝试了其他一些端点,它能够找到auth()->user()。什么可能导致它像那样丢失?

【问题讨论】:

    标签: laravel testing postman laravel-passport


    【解决方案1】:

    有点晚了,但也许有人会觉得它有帮助。为了测试您提供的注销功能,您需要将令牌作为授权标头传递。

    $response = $this->post('/logout', [], ['Authorization' => 'Bearer ' . $token])
                    ->assertStatus(200);
    

    我不知道为什么,但是使用actingAs时无法使用$user->token()检索访问令牌,但可以使用$user->tokens()->first()检索它 .

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 2019-09-28
      • 2017-10-25
      相关资源
      最近更新 更多