Laravel OAuth2 Passport API,生成令牌但无法发出请求:“未经身份验证”

Posted

技术标签:

【中文标题】Laravel OAuth2 Passport API,生成令牌但无法发出请求:“未经身份验证”【英文标题】:Laravel OAuth2 Passport API, generates Token but then unable to make requests : "unauthenticated" 【发布时间】:2020-11-04 03:16:03 【问题描述】:

我已将 OAuth2 Passport 安装到我的 Laravel 项目中。 我正在使用邮递员进行测试,我可以创建新用户,我可以登录(生成令牌)和注销。 登录后,我尝试向 API 端点发出请求,但无论我在邮递员 "message": "Unauthenticated." 中收到 401 Unauthorized response ,我都会卡住。

当我向端点发出 GET 请求时,我包含以下标头:

内容类型:application/json

X-Requested-With: XMLHttpRequest

授权:Bearer TOKENHERE

这是我的路由文件 api.php

Route::middleware('auth:api')->get('/user', function (Request $request) 
return $request->user();
);

Route::get('trip/id', 'TripController@getUserTrips');
Route::get('trainroute/id', 'TripController@getTrainRouteInfo');
Route::get('routestops/id', 'TripController@getRouteStops');
Route::post('trip', 'TripController@addTrip');
Route::get('trip', 'TripController@errorTrip') -> name('test');
           

Route::group([
    'prefix' => 'auth'
], function () 
    Route::post('login', 'AuthController@login');
    Route::post('signup', 'AuthController@signup');
  
    Route::group([
      'middleware' => 'auth:api'
    ], function() 
        Route::get('logout', 'AuthController@logout');
        Route::get('user', 'AuthController@user');
    );
);

在我的 TripController 中,我希望访问的端点在哪里,我已经包含了

public function __construct()
    
            $this->middleware('auth');
    

我已经搜索了答案并尝试了几件事,例如编辑 .htaccess 文件并确保在 GET 请求中包含 Authorization 标头。

【问题讨论】:

如果它在邮递员中工作,则可能是请求问题。你是如何提出请求的? @Daniel_Knights 我不在邮递员工作,我正在使用邮递员测试 Passport。我编辑了原始帖子以使其更清晰。我安装了 Passport 并进行了配置,然后用 Postman 进行了测试。现在不工作 那么你是在邮递员中打开一个新标签并使用响应中的令牌发出不同的请求吗? @Daniel_Knights 是的,我从 POST 登录获得 access_token,然后我复制令牌并发出新请求,并在授权选项卡中指定我包含不记名令牌,然后将令牌粘贴到那里。然后发送请求。 @Daniel_Knights 我搞定了,就像在这个问题上花费数小时一样荒谬......我所要做的就是将中间件命名为 'auth:api' 而不是简单地 'auth' 为我正在使用 api 路由 【参考方案1】:

在对这个问题进行了长时间的深入研究之后,答案很简单,在我的 TripController 中我有这个

public function __construct()
    
            $this->middleware('auth');
    

但我使用的是 api 路由,然后我看到登录等中间件被命名为“auth:api”,所以我尝试了同样的方法......它成功了!

这是正确的

public function __construct()
    
            $this->middleware('auth:api');
    

【讨论】:

刚刚浏览了我的一些旧代码,也发现了这个,很高兴你把它整理好了!

以上是关于Laravel OAuth2 Passport API,生成令牌但无法发出请求:“未经身份验证”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel auth vs Passport vs Sanctum

Laravel passport认证

将 Laravel Passport 与移动应用程序一起使用

Laravel 5.4建站06--API 认证系统 Passport

在 Laravel 5.3 Passport 中添加 Access-Control-Allow-Origin 标头响应

总是为我的 Laravel Passport 生成的 OAuth 2 令牌响应 401(未授权)