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]
根据 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' => [
'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]