해결된 질문
작성
·
259
0
Undefined property: stdClass::$csrfToken in /Users/ywkim/StudyPHP/php_blog/app/Middlewares/CsrfTokenMiddleware.php:12
Stack trace:
#0 /Users/ywkim/StudyPHP/php_blog/app/Middlewares/CsrfTokenMiddleware.php(12): App\Providers\ErrorServiceProvider::App\Providers\{closure}(8, 'Undefined prope...', '/Users/ywkim/St...', 12, Array)
#1 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Routing/RequestContext.php(82): App\Middlewares\CsrfTokenMiddleware::process()
#2 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Routing/Route.php(36): Eclair\Routing\RequestContext->runMiddlewares()
#3 /Users/ywkim/StudyPHP/php_blog/app/Providers/RouteServiceProvider.php(17): Eclair\Routing\Route::run()
#4 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Application.php(32): App\Providers\RouteServiceProvider::boot()
#5 [internal function]: Eclair\Application->Eclair\{closure}('App\\Providers\\R...', 4)
#6 /Users/ywkim/StudyPHP/php_blog/vendor/heracles8562/eclair/src/Application.php(32): array_walk(Array, Object(Closure))
#7 /Users/ywkim/StudyPHP/php_blog/public/index.php(7): Eclair\Application->boot()
#8 {main}
<script>
const $delete = document.getElementById('delete')
$delete.addEventListener('click', () => {
alert('/posts/' + '<?=$post->id?>');
fetch('/posts/' + '<?=$post->id?>', {
method: 'delete',
body: JSON.stringify({ _csrfToken: '<?=$_SESSION['CSRF_TOKEN']?>' })
}).then(() => {
window.location = '/'
})
})
</script>
//delete post
Route::add('delete', '/posts/{id}', '\App\Controllers\PostController::destroy', [
AuthMiddleware::class,
RequireMiddleware::class,
CsrfTokenMiddleware::class
]);
script부분도 강사님꺼 복붙해서 똑같은데 라우터에CsrftokenMiddleware::class 만 추가하면 에러가 납니다.
csrf 미들웨어 들어가있는 다른 라우터는 문제가 안되는데 delete할 때만 저렇게 에러가 나고 삭제처리가 안되네요..
왜그런지 알 수 있을까요
답변 2
1
안녕하세요. 정상우입니다 :)
일단, 이 문제에 대한 원인이 그래서 뭐냐? 에 대한 해답을 명쾌하게 드리지 못합니다. 경우의 수가 많기 때문입니다. 따라서 여기서는 가장 가능성이 높을 수 있는 문제에 대해 얘기해드리겠습니다. delete 의 경우에는 json 으로 ajax 요청을 보내고 있는데, body 에 있는 Csrf Token 을 CsrfTokenMiddleware 에서 해석하지 못했다면 $csrfToken 변수를 얻어오지 못합니다.
$csrfToken = filter_input(INPUT_POST, '_csrfToken', FILTER_SANITIZE_STRING) ?: json_decode(file_get_contents('php://input'))->_csrfToken;
이 코드에서 ajax 요청에 담긴 body 를 파싱하여 Csrf Token 을 얻어오는 부분은 다음과 같습니다. 이 부분에서 토큰을 얻어오지 못하면 에러가 발생합니다.
json_decode(file_get_contents('php://input'))->_csrfToken;
프론트엔드에서 delete 요청을 보냈을 때 CsrfTokenMiddleware 에서 $csrfToken 에 값이 제대로 할당이 되고, body 를 파싱하는지 검토해보시기 바랍니다. ajax 요청에 담긴 body 값은 php://input 스트림으로 서버에 전달됩니다. :)
0