我正在使用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相同失败。
您的注销方法看起来很奇怪。我会这么做
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'=
你在一次测试中做得太多了。但除此之外,我无法在代码中发现任何问题。但这对我起了作用:
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分钟。 但这里的问题是在等待期间,我能够获得新的刷新令牌和访问令牌,并且