根据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 ...
我做错了吗?
答案 0 :(得分:1)
尝试将auth中间件添加到Kernel.php
'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