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

时间:2017-03-25 10:06:55

标签: php laravel api authentication laravel-passport

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

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

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

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

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

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

我已检查过使用axois发送的请求中的标头,并且标头包含

Cookie:laravel_token = eyJpdiI6ImJ5RG1KRk ....

X-XSRF-TOKEN:eyJpdiI6IlVRRHhxSXp2VDVy ...

我做错了吗?

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

CreateFreshApiToken必须在最后一行。

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

答案 2 :(得分:0)

我能够解决数十人或数百人在线报告的错误,但除以下内容外,没有任何现有的解决方案对我有用。
根据文档使用Laravel 5.8设置护照。

就我而言,尽管我在meta标记中包含了csrf令牌,但是由于Passport文档指出laravel默认情况下不会被使用,因此没有被使用。来自文档(https://laravel.com/docs/5.8/passport#consuming-your-api-with-javascript):

  

”默认的Laravel JavaScript支架指示Axios始终   发送X-CSRF-TOKEN和X-Requested-With标头。 “

,然后提供示例:

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

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

如果在docs状态下默认以这种方式工作会很好,但是在我的情况下,我必须显式设置axios默认值,以在发出axios请求之前包括上述csrf-token元标记的内容。像这样:

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

就我而言,这是唯一使我能够克服401未经授权错误的事情,该错误似乎表明其中一个:
A)我项目的配置中的某些内容通过不设置axios请求的默认行为而改变了它们的默认行为,即不将它们设置为基于meta标签(如果存在或
)自动包含csrf令牌  B)在这一点上,文档是不准确的,在当前版本的Laravel和Passport中,这不是所述的默认行为。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-3)

尝试这个命令,它对我来说就像一个魅力。

php artisan config:cache