在每个 API 请求中传递 JWT 令牌

Posted

技术标签:

【中文标题】在每个 API 请求中传递 JWT 令牌【英文标题】:Pass JWT Token in Each API Request 【发布时间】:2021-08-16 09:23:18 【问题描述】:

您好,我正在使用 JWT Token,并且我正在使用 postman 测试 API,当使用 Postman 执行操作时,我在 postman 的 Header 中设置了不记名标头,它与 Postman 一起工作正常, 但是,如果我不想在邮递员标头中设置它并从控制器传递它怎么办? 任何解决方案都会有帮助, 这是我的代码,

控制器,

public function login(Request $request)
    
      $credentials = $request->only('email', 'password');
      $token = auth()->attempt( $credentials);
      return $this->createNewToken($token);
    
    
    public function me()
    
      $user =$this->getAuthenticatedUser();
      return response()->json(array($user));
    

  
   
    protected function createNewToken($token)
    
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 1200,
            'user' => auth()->user()
        ]);
    
   
    public function getAuthenticatedUser()
    
        try 
                if (! $user = JWTAuth::parseToken()->authenticate()) 
                    return response()->json(['user_not_found'], 404);
                

             catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) 
                    return response()->json(['token_expired'], $e->getStatusCode());
             catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) 
                    return response()->json(['token_invalid'], $e->getStatusCode());
             catch (Tymon\JWTAuth\Exceptions\JWTException $e) 
                    return response()->json(['token_absent'], $e->getStatusCode());
            
        return response()->json(compact('user'));
     




Route::post('login', [App\Http\Controllers\NewController::class, 'login'])->name('apisignin');
Route::group([
    'middleware' => 'jwt.verify',
    'prefix' => 'auth',
], function ($router) 
    Route::post('getauth', [App\Http\Controllers\NewController::class, 'getAuthenticatedUser'])->name('getAuthenticatedUser');
    Route::post('userProfile', [App\Http\Controllers\NewController::class, 'userProfile']);
    Route::post('me', [App\Http\Controllers\NewController::class, 'me']);
    Route::post('authheader', [App\Http\Controllers\NewController::class, 'authHeader']);
    Route::post('userupdate', [App\Http\Controllers\NewController::class, 'userUpdate']);
    Route::post('refresh', [App\Http\Controllers\AuthController::class, 'refresh']);
    Route::post('getAuthenticatedUser', [App\Http\Controllers\NewController::class, 'getAuthenticatedUser']);
); 




public function handle($request, Closure $next)
    
        try 
            $user = JWTAuth::parseToken()->authenticate();
         catch (Exception $e) 
            if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException)
                return response()->json(['status' => 'Token is Invalid']);
            else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException)
                return response()->json(['status' => 'Token is Expired']);
            else
                return response()->json(['status' => 'Authorization Token not found']);
            
        
        return $next($request);
     

【问题讨论】:

这取决于您用于执行请求的技术。例如,Axios 库允许您设置 default headers。 【参考方案1】:

根据您的问题,您需要从控制器发出 API 请求。

为了在此处放置令牌,只需在 Illuminate\Support\Facades\Http 外观上使用 withToken($token) 方法:

Http::withToken($token)->get($url, $parameters)

Laravel 文档:https://laravel.com/docs/8.x/http-client#bearer-tokens

【讨论】:

基本上我想为每个 API 请求设置它 您应该有某种类来发出 API 请求。我通常会创建一个方法 request($params, $method = 'get') 来为典型请求准备所有必要的数据。 好的,知道了,谢谢!

以上是关于在每个 API 请求中传递 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

在正文或令牌中传递用户 ID

JWT 令牌作为 API 中用户详细信息的来源?

使用过期令牌发出同时 API 请求时如何避免多个令牌刷新请求

ExpressJS / Angular 2 JWT 令牌

net core api 是不是检查每个请求的 jwt 到期日期? [复制]

如何在 api 请求标头中插入 api 身份验证所需的 jwt 令牌?