我正在尝试在Laravel项目中设置一个API,我想在自己的项目中使用Javascript来使用。该API是无状态的,因此我的理解是当请求该API时,CRSF令牌变得无关紧要。我遇到以下两个问题:
当我尝试发送不带X-CSRF-TOKEN标头的请求时,我得到401未经授权
似乎是标题未正确应用于响应的问题
请求从子域client.site.test到子域api.site.test发出。我已通过将“ InternalCORS”中间件应用于我的API路由来确保CORS被授权。
中间件-应用于所有API路由
class InternalCors {
public function handle($request, Closure $next) {
header('Access-Control-Allow-Origin: https://client.site.test');
header('Access-Control-Allow-Headers: Content-Type, X-Auth-Token, X-CSRF-Token, X-Requested-With, Authorization, Origin');
header('Access-Control-Allow-Methods: GET, POST, PUT');
header('Access-Control-Allow-Credentials: true');
return $next($request);
}
}
API路由
Route::middleware('auth:api')->get('/testApi', function (Request $request) {
return response()->json($request->user()->fullName(), 200);
})->name('testApi');
Ajax查询
window.$.ajax({
headers: {
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
},
xhrFields: {
withCredentials: true
},
type: 'GET',
url: 'https://api.site.test/testApi',
success: function (response) {
console.log(response);
},
error: function (xhr) {
console.error(xhr.responseText);
}
});
现在, even 与中间件明确授权“凭据”,我得到一个回应,说标头设置为不是“”,而不是“ true”。因此,我在顶部添加了Nginx指令:
add_header Access-Control-Allow-Credentials "true";
使用上述设置,对请求的响应为“ 401未经授权”。我已经仔细检查过,默认情况下, web 路由中仅包含VerifyCsrfToken中间件,而不是 api 。
我想说的是,将CRSF令牌添加到ajax查询中可以解决此问题,但是并不那么简单。似乎有3个标头会影响响应我得到:
[CSRF]:是否在Ajax请求中发送X-CSRF-TOKEN标头
[MIDD HEADER]:是否在API路由的中间件中包含header('Access-Control-Allow-Credentials: true');
[NGINX HEADER]:我是否在服务器的API路由配置中包括add_header Access-Control-Allow-Credentials "true";
以下是对Ajax查询的响应的摘要,具体取决于设置的标题:
[CSRF] [MIDD HEADER] [NGINX HEADER] :value of the 'Access-Control-Allow-Credentials' header in the response is ''
[CSRF] [MIDD HEADER] [NGINX HEADER]:value of the 'Access-Control-Allow-Credentials' header in the response is 'true, true'
[CSRF] [MIDD HEADER] [NGINX HEADER]:200 - John Smith
[CSRF] [MIDD HEADER] [NGINX HEADER] :value of the 'Access-Control-Allow-Credentials' header in the response is ''
[CSRF] [MIDD HEADER] [NGINX HEADER]:401 Unauthorized
[CSRF] [MIDD HEADER] [NGINX HEADER]:value of the 'Access-Control-Allow-Credentials' header in the response is ''
我在这里不知所措...
答案 0 :(得分:1)
您可以通过编辑在一些路由上禁用CSRF。
App\Http\Middleware\VerifyCsrfToken
并在受保护的位置添加您自己的路线名称
$except = [] array.
您可以查看更多here