passport使用auth:api中间件登录验证,已经获取到token了,但是报Unauthenticated错误。

请大佬指点一下,关键是哪里的问题。
基本配置已经完成,Postman测试能接收到token

passport使用auth:api中间件登录验证,已经获取到token了,但是报Unauthenticated错误。

但是测试请求时报错 Unauthenticated.(Bearer后面的空格已加上)
未通过验证,百度了好久没解决

passport使用auth:api中间件登录验证,已经获取到token了,但是报Unauthenticated错误。

  • token生成代码如下:

    $login = auth()->guard('apiweb')->attempt($request->only('username', 'password'));
          if ($login) {
              $userModel = auth()->guard('apiweb')->user();
              $token = $userModel->createToken('api')->accessToken;
              $userModel->increment('click');
              $data = [
                  'expire' => 7200,    //有效期
                  'token' => $token    //token
              ];
              return response()->json($data, 200);
          } else {
              return response()->json(['status' => 1001, 'msg' => '账号或密码有误,请重试'], 401);
          }
  • config下auth.php 配置如下:
    使用apiweb是为了能在auth登录时使用attempt()方法

    'guards' => [
          'web' => [
              'driver' => 'session',
              'provider' => 'users',
          ],
          'apiweb' => [
              'driver' => 'session',
              'provider' => 'apiusers',
          ],
          'api' => [
              'driver' => 'passport',
              'provider' => 'apiusers',
              'hash' => false,
          ],
      ],

    采用多表验证,用户 user 表,接口用户 Apiuser 表

    'providers' => [
          'users' => [
              'driver' => 'eloquent',
              //使用auth登录时用到的User模型
              'model' => App\Models\User::class,
          ],
          'apiusers' => [
              'driver' => 'eloquent',
              //使用auth登录时用到的ApiUser模型
              'model' => App\Models\Apiuser::class,
          ],
      ],
  • routes/api.php 配置如下(是我的中间件用的不对吗?):

    Route::group(['middleware'=>'auth:api', 'prefix' => 'v1','namespace' => 'Api'], function () {
      Route::get('users', function () {
          return '登录成功';
      });
    });
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5

登录时的 guard 和中间件的 guard 保持一致

Route::group(['middleware'=>'auth:apiweb', 'prefix' => 'v1','namespace' => 'Api'], function () {
  Route::get('users', function () {
      return '登录成功';
  });
});
3年前 评论

@风吹过有夏天的味道

改成 auth:api 还是显示 "message": "Unauthenticated." file

3年前 评论
风吹过有夏天的味道 3年前

token 生成代码

改成这样。

$login = auth()->guard('api')->attempt($request->only('username', 'password'));

// 把apiweb都替换成api

driver 完全不一样,保持用同样的guard

api: passport

apiweb: session

3年前 评论
Age_Chen (楼主) 3年前
lyxxxh (作者) 3年前

查了好几天,最后定位问题应该是请求头携带的 token 令牌传送不过去(原因暂时还没找到)

暂时采用的解决办法是在 AuthServiceProvider.php 中重新设置请求头传送token

if (request()->has('token')) {
            request()->headers->set('Authorization','Bearer '.request()->get('token'));
        }
3年前 评论
Age_Chen (作者) (楼主) 3年前
qiyeal 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!