Php axios的API请求始终未经Laravel API授权

Php axios的API请求始终未经Laravel API授权,php,laravel,api,axios,Php,Laravel,Api,Axios,我正在使用5.6和库(标准Laravel包)进行一个个人项目 我需要使用Laravel的API和axios的http请求先发送GET,然后发送POST请求,但我不使用Passport或任何类似的库,因为它是一个内部API,仅为VueJ提供服务,用于从数据库获取内容 如果我使用auth:API中间件设置API路由,我总是会得到未经授权的响应,以请求类型为准,这是错误输出: 错误:请求失败,状态代码为401 信息: message: "Unauthenticated." 但是,正如我在文档中读到的

我正在使用5.6和库(标准Laravel包)进行一个个人项目

我需要使用Laravel的API和axios的http请求先发送GET,然后发送POST请求,但我不使用Passport或任何类似的库,因为它是一个内部API,仅为VueJ提供服务,用于从数据库获取内容

如果我使用
auth:API
中间件设置API路由,我总是会得到未经授权的响应,以请求类型为准,这是错误输出:

错误:请求失败,状态代码为401

信息:

message: "Unauthenticated."
但是,正如我在文档中读到的,axios头被设置在laravel的
bootstrap.js
中,用于从元标记读取授权令牌(代码就在那里):

如果需要,下面是http请求代码:

axios.post('/api/latest', formData)
那么,如果设置了这些,为什么我未经验证

我已尝试删除
auth:api
中间件,当然,它正在工作:

- Route::middleware('auth:api')->get('/latest', 'InternalApiController@latestEp');
+ Route::get('/latest', 'InternalApiController@latestEp');

我做错了什么?

CSRF令牌与授权令牌不同。您很可能需要手动添加授权令牌,这可能类似于,具体取决于您的授权方法

我没有使用Passort或任何类似的库,因为它是一个内部API,只为VueJ提供服务,以便从数据库中获取内容

如果API不是无状态的,这意味着已知用户是使用标准会话cookie登录的,那么您可以只使用默认的
'web'
中间件进行API路由

在默认的
RouteServiceProvider
中,将
mapApiRoutes
功能改为使用
web
中间件:

protected function mapApiRoutes()
{
    Route::prefix('api')
        // ->middleware('api')
        ->middleware('web')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

也就是说,您确实应该将API路由放在默认的
'auth'
中间件后面,因为它们在默认情况下不受限制

routes/api.php
文件中:

Route::group(['middleware' => 'auth'], function() {
    Route::get('/latest', 'InternalApiController@latest');
});
如果您想确保它是一个AJAX请求,可以创建一个简单的中间件来检查请求是否具有
X-request-With
头设置为
XMLHttpRequest

class RequestIsAjax
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!$request->ajax()) {
            return redirect()->route('login.index');
        }

        return $next($request);
    }
}
并将其注册到
\App\Http\Kernel
类中的
$routeMiddleware
数组中

protected $routeMiddleware = [
    'ajax' => \App\Http\Middleware\RequestIsAjax::class,

对于Laravel8,我在尝试从后端api请求某些内容时遇到了401错误。按照被接受的答案让我接近了,但它仍然不起作用。我相信这是因为我在子域上的仪表板是
users.mydomain.tld
,而我使用Axios的位置是在主域上的
mydomain.tld/some/path
。问题是会话cookie的路径。重新配置时,需要清除所有cookie(开发工具工具栏)。然后在进行更改后,像正常情况一样重新登录。否则,cookies将被弄乱,您将无法看到它被修复,或者在清除它们之前您将无法登录

我恢复了我所做的所有更改(按照接受的答案),并将
会话\u域
环境变量固定为关键要素,至少当涉及到主用户区域位于子域时是如此

.env
文件中:

Route::group(['middleware' => 'auth'], function() {
    Route::get('/latest', 'InternalApiController@latest');
});
SESSION_DOMAIN=“.yourdomain.tld”
app/Providers/RouteServiceProvider.php中
api
更改为
web
中的
boot()
方法:

路由::前缀('api') //->中间件('api') ->中间件(“web”) ->名称空间($this->namespace) ->组(base_path('routes/api.php'); 在
routes/api.php
中:

Route::middleware('auth')->get('/user',函数(Request$Request){
返回$request->user();
});
在您的
资源/js/bootstrap.js
中:

window.axios.defaults.withCredentials=true;
修改
bootstrap.js
文件后,需要再次运行
npm run dev
重新编译


现在,您应该能够在前端JavaScript中使用Axios了。无论是jQuery还是Vue,无论您使用的是什么

axios.get('/api/user')
.then(response=>console.dir(response.data))
.catch(错误=>console.log(错误));

如果我把api.php
Route::middleware('auth:api')->get('/latest','InternalApiController@latest');我还是一样的error@K3nzie您仍在使用
auth:api
来检查
api
auth保护。只要使用
中间件('auth')
,它就会工作。好吧,修复了它,但仍然是这样,api端点可以从web访问,而只希望从Vue使用,这是可能的吗?@K3nzie我添加了一个简单的AJAX检查中间件,它可以帮助隐藏api端点,避免意外的浏览器导航。效果很好!你救了梅,我更惊讶了,我3年前的问题仍然得到了关注,哈哈,但很高兴知道!有用信息