Php axios的API请求始终未经Laravel API授权
我正在使用5.6和库(标准Laravel包)进行一个个人项目 我需要使用Laravel的API和axios的http请求先发送GET,然后发送POST请求,但我不使用Passport或任何类似的库,因为它是一个内部API,仅为VueJ提供服务,用于从数据库获取内容 如果我使用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." 但是,正如我在文档中读到的
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.phpRoute::middleware('auth:api')->get('/latest','InternalApiController@latest');代码>我还是一样的error@K3nzie您仍在使用auth:api
来检查api
auth保护。只要使用中间件('auth')
,它就会工作。好吧,修复了它,但仍然是这样,api端点可以从web访问,而只希望从Vue使用,这是可能的吗?@K3nzie我添加了一个简单的AJAX检查中间件,它可以帮助隐藏api端点,避免意外的浏览器导航。效果很好!你救了梅,我更惊讶了,我3年前的问题仍然得到了关注,哈哈,但很高兴知道!有用信息