我想在使用Slim3创建的Web应用程序上添加具有REST API的用户。 我在应用程序上使用相同的路径来添加用户并且它的工作原理。 但是,自从其他网站发出ajax请求以来,我有一个错误的请求" 400。因为CSRF检查失败了。 在此请求之前,我使用GET方法获取CSRF令牌并使用CSRF令牌数据构建隐藏输入。然后我在POST方法中提供CSRF令牌,但它不起作用......我不明白。
感谢。
Ajax获取方法:
$.get("https://extranet.exemple.fr/api/token", {})
.done(function (data, text, jqxhr) {
if (data.success === true) {
$("#csrf_name").val(data.csrf.csrf_name);
$("#csrf_value").val(data.csrf.csrf_value);
}
})
.fail(function (jqxhr) {})
.always(function () {});
});
Ajax POST:
var csrfname = $("#csrf_name").val();
var csrfvalue = $("#csrf_value").val();
var objajaxargs = {
dataUser: dataUser,
csrf_name: csrfname,
csrf_value: csrfvalue,
};
$.post("https://extranet.exemple.fr/user/add", objajaxargs)
.done(function (data, text, jqxhr) {
if (data.success === true) {
alert("success");
}
})
.fail(function (jqxhr) {})
.always(function () {});
在我的容器中
$container["csrf"] = function ($container) {
return new \Slim\Csrf\Guard();
};
Slim GET方法
$app->get('/api/token', function (\Slim\Http\Request $request, \Slim\Http\Response $response, $args) use ($app) {
$container = $app->getContainer();
// Generate new token and update request
$request = $container->csrf->generateNewToken($request);
// Build Header Token
$nameKey = $container->csrf->getTokenNameKey();
$valueKey = $container->csrf->getTokenValueKey();
$name = $request->getAttribute($nameKey);
$value = $request->getAttribute($valueKey);
$tokenArray = [
$nameKey => $name,
$valueKey => $value
];
$respCSRF["success"] = false;
if (!empty($tokenArray)) {
$respCSRF["success"] = true;
$respCSRF["csrf"] = $tokenArray;
}
return $response->withJson($respCSRF);});
超薄POST方法
$app->post("/user/add", function (\Slim\Http\Request $request, \Slim\Http\Response $response, $args) use ($app) {
$container = $app->getContainer();
$objBody = $request->getParsedBody();
$objUser = new \App\Models\UserModel($container);
foreach ($objBody["dataUser"] as $key => $value) {
$objAdherent->$key = $value;
}
$arrJsonResponse = ["success" => false];
if (filter_var($objUser->mail, FILTER_VALIDATE_EMAIL) !== false) {
$infosAdd = $objUser->addUser();
if ($infosAdd !== false) {
$arrJsonResponse["success"] = true;
return $response->withJson($arrJsonResponse)->withStatus(201);
}
}
return $response->withJson($arrJsonResponse)->withStatus(400);});
答案 0 :(得分:2)
我解决了我的问题。我将csrf标记持久性设置为true并且它有效!
解决方案:
/**
* Init CSRF
* @return \Slim\Csrf\Guard
*/
$container["csrf"] = function ($container) {
$guard = new \Slim\Csrf\Guard();
$guard->setPersistentTokenMode(true);
return $guard;
};