PasswordReset.request: recaptcha argument breaks the code
Описание
При попытке передать значение аргумента recaptcha
в методе PasswordReset.request
возникает ошибка в коде на стороне сервера.
{
"success": false,
"message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'recaptcha' in 'where clause' (SQL: select * from `users` where `email` = constantine@amazingcat.net and `recaptcha` is null and `users`.`deleted_at` is null limit 1)",
"debug": {
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php",
"line": 671,
"code": 42,
"class": "Illuminate\\Database\\QueryException",
"trace": [
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php",
"line": 631,
"function": "runQueryCallback",
"class": "Illuminate\\Database\\Connection",
"type": "->",
"args": [
"select * from `users` where `email` = ? and `recaptcha` is null and `users`.`deleted_at` is null limit 1",
[
"constantine@amazingcat.net"
],
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php",
"line": 339,
"function": "run",
"class": "Illuminate\\Database\\Connection",
"type": "->",
"args": [
"select * from `users` where `email` = ? and `recaptcha` is null and `users`.`deleted_at` is null limit 1",
[
"constantine@amazingcat.net"
],
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Query\/Builder.php",
"line": 2202,
"function": "select",
"class": "Illuminate\\Database\\Connection",
"type": "->",
"args": [
"select * from `users` where `email` = ? and `recaptcha` is null and `users`.`deleted_at` is null limit 1",
[
"constantine@amazingcat.net"
],
true
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Query\/Builder.php",
"line": 2190,
"function": "runSelect",
"class": "Illuminate\\Database\\Query\\Builder",
"type": "->",
"args": []
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Query\/Builder.php",
"line": 2685,
"function": "Illuminate\\Database\\Query\\{closure}",
"class": "Illuminate\\Database\\Query\\Builder",
"type": "->",
"args": []
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Query\/Builder.php",
"line": 2191,
"function": "onceWithColumns",
"class": "Illuminate\\Database\\Query\\Builder",
"type": "->",
"args": [
[
"*"
],
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Eloquent\/Builder.php",
"line": 539,
"function": "get",
"class": "Illuminate\\Database\\Query\\Builder",
"type": "->",
"args": [
[
"*"
]
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Eloquent\/Builder.php",
"line": 523,
"function": "getModels",
"class": "Illuminate\\Database\\Eloquent\\Builder",
"type": "->",
"args": [
[
"*"
]
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Concerns\/BuildsQueries.php",
"line": 143,
"function": "get",
"class": "Illuminate\\Database\\Eloquent\\Builder",
"type": "->",
"args": [
[
"*"
]
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/EloquentUserProvider.php",
"line": 131,
"function": "first",
"class": "Illuminate\\Database\\Eloquent\\Builder",
"type": "->",
"args": []
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/Passwords\/PasswordBroker.php",
"line": 133,
"function": "retrieveByCredentials",
"class": "Illuminate\\Auth\\EloquentUserProvider",
"type": "->",
"args": [
{
"email": "constantine@amazingcat.net",
"recaptcha": null
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/Passwords\/PasswordBroker.php",
"line": 52,
"function": "getUser",
"class": "Illuminate\\Auth\\Passwords\\PasswordBroker",
"type": "->",
"args": [
{
"email": "constantine@amazingcat.net",
"recaptcha": null
}
]
},
{
"file": "\/app\/backend\/app\/Http\/Controllers\/PasswordResetController.php",
"line": 147,
"function": "sendResetLink",
"class": "Illuminate\\Auth\\Passwords\\PasswordBroker",
"type": "->",
"args": [
{
"email": "constantine@amazingcat.net",
"recaptcha": null
}
]
},
{
"function": "request",
"class": "App\\Http\\Controllers\\PasswordResetController",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Controller.php",
"line": 54,
"function": "call_user_func_array",
"args": [
[
{},
"request"
],
[
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/ControllerDispatcher.php",
"line": 45,
"function": "callAction",
"class": "Illuminate\\Routing\\Controller",
"type": "->",
"args": [
"request",
[
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Route.php",
"line": 239,
"function": "dispatch",
"class": "Illuminate\\Routing\\ControllerDispatcher",
"type": "->",
"args": [
{
"uri": "v1\/auth\/password\/reset\/request",
"methods": [
"POST"
],
"action": {
"middleware": [
"api",
"throttle:120,1"
],
"uses": "App\\Http\\Controllers\\PasswordResetController@request",
"controller": "App\\Http\\Controllers\\PasswordResetController@request",
"namespace": "App\\Http\\Controllers",
"where": [],
"as": "generated::t4oRYNC0kEaSYMic",
"prefix": "v1\/auth"
},
"isFallback": false,
"controller": {},
"defaults": [],
"wheres": [],
"parameters": [],
"parameterNames": [],
"computedMiddleware": [
"api",
"throttle:120,1"
],
"compiled": {}
},
{},
"request"
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Route.php",
"line": 196,
"function": "runController",
"class": "Illuminate\\Routing\\Route",
"type": "->",
"args": []
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php",
"line": 685,
"function": "run",
"class": "Illuminate\\Routing\\Route",
"type": "->",
"args": []
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 128,
"function": "Illuminate\\Routing\\{closure}",
"class": "Illuminate\\Routing\\Router",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Middleware\/SubstituteBindings.php",
"line": 41,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Illuminate\\Routing\\Middleware\\SubstituteBindings",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Middleware\/ThrottleRequests.php",
"line": 59,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{},
120,
"1"
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 103,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php",
"line": 687,
"function": "then",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php",
"line": 662,
"function": "runRouteWithinStack",
"class": "Illuminate\\Routing\\Router",
"type": "->",
"args": [
{
"uri": "v1\/auth\/password\/reset\/request",
"methods": [
"POST"
],
"action": {
"middleware": [
"api",
"throttle:120,1"
],
"uses": "App\\Http\\Controllers\\PasswordResetController@request",
"controller": "App\\Http\\Controllers\\PasswordResetController@request",
"namespace": "App\\Http\\Controllers",
"where": [],
"as": "generated::t4oRYNC0kEaSYMic",
"prefix": "v1\/auth"
},
"isFallback": false,
"controller": {},
"defaults": [],
"wheres": [],
"parameters": [],
"parameterNames": [],
"computedMiddleware": [
"api",
"throttle:120,1"
],
"compiled": {}
},
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php",
"line": 628,
"function": "runRoute",
"class": "Illuminate\\Routing\\Router",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{
"uri": "v1\/auth\/password\/reset\/request",
"methods": [
"POST"
],
"action": {
"middleware": [
"api",
"throttle:120,1"
],
"uses": "App\\Http\\Controllers\\PasswordResetController@request",
"controller": "App\\Http\\Controllers\\PasswordResetController@request",
"namespace": "App\\Http\\Controllers",
"where": [],
"as": "generated::t4oRYNC0kEaSYMic",
"prefix": "v1\/auth"
},
"isFallback": false,
"controller": {},
"defaults": [],
"wheres": [],
"parameters": [],
"parameterNames": [],
"computedMiddleware": [
"api",
"throttle:120,1"
],
"compiled": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php",
"line": 617,
"function": "dispatchToRoute",
"class": "Illuminate\\Routing\\Router",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php",
"line": 165,
"function": "dispatch",
"class": "Illuminate\\Routing\\Router",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 128,
"function": "Illuminate\\Foundation\\Http\\{closure}",
"class": "Illuminate\\Foundation\\Http\\Kernel",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/app\/Http\/Middleware\/SentryContext.php",
"line": 22,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "App\\Http\\Middleware\\SentryContext",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/app\/Http\/Middleware\/LockMiddleware.php",
"line": 39,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "App\\Http\\Middleware\\LockMiddleware",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/fruitcake\/laravel-cors\/src\/HandleCors.php",
"line": 37,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Fruitcake\\Cors\\HandleCors",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/TransformsRequest.php",
"line": 21,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/TransformsRequest.php",
"line": 21,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/ValidatePostSize.php",
"line": 27,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Middleware\/CheckForMaintenanceMode.php",
"line": 63,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 167,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
},
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Pipeline\/Pipeline.php",
"line": 103,
"function": "Illuminate\\Pipeline\\{closure}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php",
"line": 140,
"function": "then",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->",
"args": [
{}
]
},
{
"file": "\/app\/backend\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Http\/Kernel.php",
"line": 109,
"function": "sendRequestThroughRouter",
"class": "Illuminate\\Foundation\\Http\\Kernel",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
},
{
"file": "\/app\/backend\/public\/index.php",
"line": 53,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Kernel",
"type": "->",
"args": [
{
"attributes": {},
"request": {},
"query": {},
"server": {},
"files": {},
"cookies": {},
"headers": {}
}
]
}
]
},
"error_type": "query"
}
Проблема
Все дело в этой сточке. Согласно Laravel документации функция Password::sendResetLink
принимает массив, ключи которого будут использованы напрямую при выборке сущности User из БД. Согласно коду, этот массив также содержит ключ и значение recaptcha, которое судя по всему не относится к сущности User в БД и передается в метод Password::sendResetLink
по ошибке.
Решение
Задействовать ресурс/модель User и передавать методу Password::sendResetLink
только данные доступные у этого ресурса/модели.
Edited by Constantine Belkin