【问题标题】:is it right to revoke, invalidate, delete or auth logout for making the user logout in a guarded passport api撤销、无效、删除或授权注销以使用户在受保护的护照 api 中注销是否正确
【发布时间】:2021-07-06 15:17:42
【问题描述】:

如果我通过护照登录到我的外部应用程序,如许多教程中所示:

public function login(Request $request)
{ 
    $data=$request->all();
    $validator = Validator::make($data, [
        'email' => 'email|required',
        'password' => 'required'
        
    ]);

    if($validator->fails()){
        return response()->json(['error' => $validator->errors(), 'Validation Error',400]);
    }

    if (!auth()->attempt($data)) {
        return response(['message' => 'Invalid Credentials'],400);
    }

    $accessToken = auth()->user()->createToken('authToken')->accessToken;
    return response()->json(['user' => auth()->user(), 'access_token' => $accessToken], 200);

}

我已经阅读了很多帖子、howto 并看过一些视频,但是在这种情况下没有明确的注销用户的程序,并且 laravel 的手册没有说明任何内容(为什么?或者它在哪里)。

我找到了可能的解决方案:

  • auth()->user()->token()->revoke();
  • $request->user()->token()->revoke();
  • auth()->logout();
  • $request->session()->invalidate();

其中哪些执行注销的权限步骤? 我的方法应该类似于:

 public function logout(Request $request) {
        //auth()->user()->token()->revoke();
        //$request->user()->token()->revoke();
       // auth()->logout();
        //$request->session()->invalidate();

        return response()->json(['message' => 'User successfully signed out'], 200);
    }

而且粗略应该是:

Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:api');

还是我错了???

如果用户未通过身份验证以查看资源,如何不重定向到登录路由? 如果我发回:

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            response()->json(['mex'=>'not authorized'], 401);
        }
    }
}

不起作用并给我发回错误:

ErrorException: 标头不能包含多个标头,新的 在文件中检测到的行 ...../vendor/symfony/http-foundation/Response.php 在第 359 行

【问题讨论】:

    标签: json api laravel-8 laravel-passport


    【解决方案1】:

    退出 此外,如果您使用过护照,请检查您的数据库中是否有“oauth_access_tokens”表。

    public function logout(Request $request) {
            
        DB::table('oauth_access_tokens')->where('user_id', Auth::id())->delete();
        
        
        return response()->json(['message' => 'User successfully signed out'], 200);
     }
    

    路线应该是:-

     Route::group('middleware'=>['auth:api'], function(){
        
        Route::post('logout', [AuthController::class, 'logout'])->name('logout');
    });
    

    如果用户未通过身份验证:-

    将以下代码添加到 App\Exceptions\Handler.php

    use Illuminate\Auth\AuthenticationException;
    use Illuminate\Support\Facades\Auth;
    
    /**
         * Convert an authentication exception into an unauthenticated response.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Illuminate\Auth\AuthenticationException  $exception
         * @return \Illuminate\Http\Response
         */
        protected function unauthenticated($request, AuthenticationException $exception)
        {
            $current_gaurd = array_get($exception->guards(), 0);
            $route = route('login');
    
            // if ($current_gaurd == 'admin') {
               // $route = route('admin.login');
            //}
    
            return $request->expectsJson()
            ? response()->json(['meta' => ['messsage' => $exception->getMessage()]], 401)
            : redirect()->guest($route);
        }
    
    

    另外,将所有路由放在中间件 AUTH 组中,因为用户未通过身份验证

    希望这对你有帮助。

    【讨论】:

    • 非常感谢您的评论,很难找到有关身份验证护照工作流程的信息,甚至官方文档也缺少很多信息,我想知道为什么...我在想'revoke()' 做与您显示的手动删除相同。还是我错了?我在'class Authenticate'处理程序中添加了我的401逻辑,不同路径的目标是否相同?
    猜你喜欢
    • 2018-06-07
    • 2019-12-10
    • 2020-09-03
    • 2014-10-20
    • 2019-08-07
    • 2012-09-10
    • 1970-01-01
    • 2019-06-01
    • 2017-03-20
    相关资源
    最近更新 更多