Laravel API 使用 Passport 的身份验证导致 401(未授权)

Laravel API Authentication using Passport results in 401 (Unauthorized)

根据 Laravel 关于 API 路由的 Passport authentication 的文档,我目前在使用 axois 从 api 获取数据时遇到一些问题。

到目前为止,我已经通过 Composer 安装了 Passport,添加了 hasApiTokens 特性,在 AuthServiceProvider 的启动方法中添加了对 Passport::routes 的调用,并设置了 api 身份验证的 driver 选项守护到'passport'.

因为我希望用户在登录后从基于 Vue 的 SPA 使用 API 到 Javascript,我已将 CreateFreshApiToken 添加到 Web 中间件组。

当我 运行 以下代码段测试所有内容时出现问题:

axios.get('api/users').then( function(response) { console.log(response.data); }); 

结果是“无法加载资源:服务器响应状态为 401(未授权)”响应。

我已经检查了使用 axois 发送的请求中的 headers 并且 headers 包含两者

Cookie:laravel_token=eyJpdiI6ImJ5RG1KRk....

X-XSRF-TOKEN:eyJpdiI6IlVRRHhxSXp2VDVy...

我做错了什么吗?

尝试将 auth 中间件添加到 Kernel.php

的 api 组
    'api' => [
        'throttle:60,1',
        'bindings',
        'auth:api',
    ],

https://github.com/jeremykenedy/laravel-passport/blob/master/app/Http/Kernel.php

试试这个命令,它对我很有用。

php artisan config:cache

我能够解决数十或数百人在线报告的这个错误,但 none 现有解决方案对我有效,但以下内容除外。
使用 Laravel 5.8,按照文档设置 Passport。

在我的例子中,虽然我在元标记中包含了 csrf 令牌,但它没有被拾取,因为 Passport 文档指出 laravel 默认情况下会被拾取。来自文档 (https://laravel.com/docs/5.8/passport#consuming-your-api-with-javascript):

" the default Laravel JavaScript scaffolding instructs Axios to always send the X-CSRF-TOKEN and X-Requested-With headers. "

然后提供示例:

// In your application layout...
<meta name="csrf-token" content="{{ csrf_token() }}">

// Laravel's JavaScript scaffolding...
window.axios.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
};

好吧,如果它在默认情况下像文档状态那样工作,那就太好了,但在我的情况下,我必须在制作之前明确设置 axios 默认值以包含所述 csrf-token 元标记的内容axios 请求。像这样:

window.axios.defaults.headers.common = {
                        'X-Requested-With': 'XMLHttpRequest',
                        'X-CSRF-TOKEN' : document.querySelector('meta[name="csrf-token"]').getAttribute('content')
                };

就我而言,这是唯一让我克服 401 未经授权错误的方法,这似乎表明:
A)我的项目配置中的某些东西通过不自动设置它们来改变 axios 请求的默认行为包括 csrf-token 基于元标记(如果存在)或
B) 文档在这一点上是不准确的,在 Laravel 和 Passport 的当前版本中,这不是所述的默认行为。

CreateFreshApiToken 必须在最后一行。

'web' => [
    // Other middleware...
    \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],

我尝试了下面的代码。将以下代码粘贴到项目根文件夹中的 .htaccess 文件中。

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]