我试图弄清楚如何测试我的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 actingAs帮助程序来设置响应。
Passport::actingAs(
$user,
['read write']
);
$response = $this->post('/logout')
->assertStatus(200);
测试失败,因为代码给出了500个错误,因为auth()->user()->token()
是...空的?例如,$accessToken->id
不应为0,这意味着代码将失败。
我不确定这是否是预期的行为,这是因为Passport的actingAs助手的工作方式而我实际上无法测试注销功能,或者我的注销功能是否有问题。死了!
我的路线:
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()
。是什么导致它像那样丢失?
答案 0 :(得分:0)
已经有点晚了,但是也许有人会觉得有用。为了测试您提供的注销功能,您需要将令牌作为授权标头传递。
$response = $this->post('/logout', [], ['Authorization' => 'Bearer ' . $token])
->assertStatus(200);
我不确定为什么,但是使用actingAs时无法使用$user->token()
检索访问令牌,但是可以使用$user->tokens()->first()
检索访问令牌