Laravel Passport不会创建Laravel_token,然后在使用自己的API时将显示错误401 Unauthenticated

时间:2019-07-02 05:41:07

标签: php laravel laravel-passport

经过两天对该问题的调查并阅读了有关此问题的所有问题/解决方案,我决定与大家分享此问题。
我当前的主要问题是:
laravel_token不是使用使用自己的API的Laravel通行证创建的。 但是,它是在用户登录时创建的。

运行:

  • 无用的本地主机,窗口10
  • Laravel 5.8
  • 护照:7.3
  • 为API使用多重防护
  • 使用Axios使用API​​
  • 使用Vue提交表单

有关项目的简要说明
具有一个下订单系统API,可以由管理员或网站访问者下订单。 两者都将使用API​​。
所以我有2位警卫:管理员,用户
这是我所做的:

这是我的config \ auth.php:

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'admin' => [
            'driver'    => 'session',
            'provider'  =>  'admins'
        ],

        'admin-api' =>  [
            'driver'    =>  'passport',
            'provider'  =>  'admins'
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],


-在用户和管理员模型中添加了HasApiTokens
-在管理员模型中添加了警卫姓名

管理员模型

    protected $guard = 'admin';
    protected $guard_name = 'admin';

app \ Http \ Kernel.php


protected $middlewareGroups = [
        'web' => [
....
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
'api' => [
            'throttle:60,1',
            'bindings',
        ],

app \ Providers \ AuthServiceProvider.php


protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

public function boot()
    {
        $this->registerPolicies();

        Passport::routes();

        Passport::tokensExpireIn(Carbon::now()->addDays(15));

        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
    }

Api路线

...
//admin CRUD orders
Route::middleware('auth:admin-api')->group(function(){
        Route::apiResource('orders', 'Api\OrderController');
    }); //works fine because admin user needs to login
//when consuming own API, wont work!!

//I was thinking passport needs a GET request to 
//create Cookie, it is still not working if I remove it
Route::middleware('auth:api')->group(function(){
        Route::get('orders/refresh-token', 'Api\OrderController@refreshToken')->name('orders.refresh-token'); 
//when form is submitted
        Route::put('orders/complete-store-order', 'Api\OrderController@completetStore')->name('orders.complete-store-order');
    }); 
...

编译js文件时添加了标头:

let token = document.head.querySelector('meta[name="csrf-token"]');
 window.axios.defaults.headers.common = {
     'X-Requested-With': 'XMLHttpRequest',
     'Accept': 'application/json',
     'Content-Type': 'application/json',
     'X-CSRF-TOKEN': token.content,
 };


我当前的问题是:
使用自己的API时不会生成laravel_token cookie,但是会在Admin user登录时生成它。

我在护照文件中找到的内容
1)在句柄功能下的文件vendor\laravel\passport\src\Http\Middleware\CreateFreshApiToken.php第48行中使用自己的API 时:$ gurad为空

2)在同一文件行中使用自己的API时:在功能:requestShouldReceiveFreshToken下的$request->user($this->guard)null 总是 {{1}},因为没有用户,但是当用户登录时使用Passport时,它不是空的,它将生成Cookie并正常运行。

 使用自己的API时如何填充用户??

这是我的请求标头上的一些屏幕截图,...可以帮上忙:

1)管理员用户登录时,请求标头包含:

enter image description here

2)使用自己的API时发送标头

enter image description here

1 个答案:

答案 0 :(得分:0)

可能需要在标头中插入用户令牌才能执行auth API调用。

Authorization: Bearer {{$token}}

我使用了这个简单的教程:https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876