【问题标题】:Laravel passport how to logout user?Laravel护照如何注销用户?
【发布时间】:2020-09-03 06:48:53
【问题描述】:

我有一个主要和客户项目。客户端项目通过 laravel 护照使用主项目的授权。登录工作正常,但是当我尝试使用$request->user()->token()->revoke(); 注销时,客户端项目将用户重定向回主项目进行授权,但由于某种原因,而不是询问对于登录,主项目只需发出一个新令牌并将用户重定向回客户端项目。我认为问题在于我的登录路由和返回 SPA 应用程序的路由都放在 web 中,而所有其他路由都放在 api 中,但我不知道如何解决这个问题。另外,我在 web 中使用 \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class (正如我所理解的那样,我不会在每个请求中发送不记名令牌)。我应该怎么做才能使注销正常工作?

我的登录和应用程序路由(放置在网络中)

Route::get('/authorization{any}', 'SpaController@auth')->where('any', '^.*$');
Route::get('/{any}', 'SpaController@main')->where('any', '^(?!api)(?!logout)(?!storage).*$')->middleware('auth');
Route::get('logout', 'AuthController@logout')->middleware('auth');
Route::post('login', 'AuthController@login');

授权控制器

public function login(Login $request)
{
    if (config('recaptcha.enabled') && !$this->checkRecaptcha($request['recaptchaToken'], $request->ip())) {
         return 'Captcha error';
    }
    $credentials = request(['email', 'password']);
    if(!Auth::attempt($credentials))
        return response()->json([
            'message' => 'Unauthorized'
        ], 401);
    $user = $request->user();
    $tokenResult = $user->createToken('Personal Access Token');
    $token = $tokenResult->token;
    if ($request->remember_me)
        $token->expires_at = Carbon::now()->addWeeks(1);
    $token->save();
    return (['redirect' => redirect()->intended('/')->getTargetUrl()]);
}

登出路径(放在api中)

Route::middleware(['auth:api','request.log'])->get('/logout', function (Request $request) {
    $request->user()->token()->revoke();
});

【问题讨论】:

  • 您是否尝试过使用连接Auth Facade的注销方式?在我的控制器中,它看起来像这样... auth()->logout();
  • @JohnSims 如果我使用 auth()->logout() 我收到错误 Method Illuminate\Auth\RequestGuard::logout 不存在
  • Route::get('/logout', '\App\Http\Controllers\Auth\LoginController@logout')->name('logout');试试这个
  • @TimeParadox 我尝试安装 laravel 基本授权,但是当我这样做时 auth::attempt 开始总是返回 false
  • 您的oauth_access_token 表对于主客户端和客户端都相同吗?

标签: php laravel laravel-passport


【解决方案1】:

好吧!我不确定你在做什么,但希望它会对你有所帮助

如果mainclientoauth_access_tokenmainclient 表都是单独的,那么你可以像这样简单:

表结构:

oauth_access_tokens

id             | user_id                      | name
// token        // id from main and client     // use this like boolean 0=> main 1=>client

通过这个,您可以轻松地将mainclient 标记分开

制作一个像这样的注销功能 =>

How to logout JWT token using Multi authentication with different table of User

如果需要任何修改,请告诉我!

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2019-12-10
    • 2014-10-20
    • 1970-01-01
    • 2019-08-07
    • 2018-08-11
    • 1970-01-01
    • 2016-02-13
    • 2018-03-03
    相关资源
    最近更新 更多