Cakephp 3.x ADmad/JwtAuth MissingRouteException
Posted
技术标签:
【中文标题】Cakephp 3.x ADmad/JwtAuth MissingRouteException【英文标题】: 【发布时间】:2017-08-10 02:42:16 【问题描述】:老问题,但我遇到了与@ChocoboGordo (Cakephp 3.x ADmad/JwtAuth doesn't work) 完全相同的错误。 当我尝试在 CakePHP Rest API(不使用 CRUD 插件)中使用 JWT 时,我得到一个 MissingRouteException,因为它找不到登录路径(请参阅下面的响应)。 有什么想法吗?
这是我的代码: App\Controller\Api\AppController
public function initialize()
parent::initialize();
$this->loadComponent('RequestHandler');
$this->loadComponent('Auth', [
'storage' => 'Memory',
'loginAction' => [
'prefix' => 'api',
'controller' => 'Usuario',
'action' => 'login',
'plugin' => false
],
'authenticate' => [
'Form' => [
'userModel' => 'Usuario',
'scope' => ['Usuario.Activo' => 1],
'fields' => [
'username' => 'DNI',
'password' => 'Clave'
],
],
'ADmad/JwtAuth.Jwt' => [
'parameter' => 'token',
'userModel' => 'Usuario',
'scope' => ['Usuario.Activo' => 1],
'fields' => [
'username' => 'DNI',
'password' => 'Clave'
],
'queryDatasource' => true
]
],
'unauthorizedRedirect' => false,
'checkAuthIn' => 'Controller.initialize'
]);
config\routes.php:
Router::prefix('api', function ($routes)
$routes->extensions(['json']);
...
$routes->resources('Usuario', [
'map' => [
'login' => [
'controller' => 'Usuario',
'action' => 'login'
]
]
]);
...
);
Controller\Api\UsuarioController:
public function initialize()
parent::initialize();
$this->Auth->allow(['add', 'login']);
...
public function login()
if ($this->request->is(['post']))
$this->response->header('Access-Control-Allow-Origin', '*');
$postParams = $this->request->input('json_decode', true) ;
if (!isset($postParams['DNI']) || !isset($postParams['Clave']))
throw new BadRequestException();
$_POST['DNI'] = $postParams['DNI'];
$_POST['Clave'] = $postParams['Clave'];
$user = $this->Auth->identify();
if (!$user)
throw new UnauthorizedException('Auth error');
$this->set(array(
'message' => 'Login Ok',
'token' => JWT::encode([
'sub' => $user['DNI'],
'exp' => time() + 604800
],
Security::salt()),
'_serialize' => array('message', 'token')
));
return;
throw new BadRequestException();
当我打电话登录时,它可以正常工作并正确给我令牌。但是当我尝试调用另一个操作(包括带有 Bearer+token 的 Autorization 标头)时,会显示此错误:
回应:
Error: [Cake\Routing\Exception\MissingRouteException] A route matching 'prefix' => 'api',
'controller' => 'Usuario',
'action' => 'login',
'plugin' => NULL,
'_ext' => NULL,
)" could not be found.
Exception Attributes: array (
'url' => 'array (
\'prefix\' => \'api\',
\'controller\' => \'Usuario\',
\'action\' => \'login\',
\'plugin\' => NULL,
\'_ext\' => NULL,
)',
'context' =>
array (
'_base' => '/registro-api',
'_port' => '80',
'_scheme' => 'http',
'_host' => 'localhost',
'params' =>
array (
'pass' =>
array (
),
'controller' => 'Usuario',
'action' => 'index',
'_method' => 'GET',
'prefix' => 'api',
'plugin' => NULL,
'_matchedRoute' => '/api/usuario',
'_ext' => NULL,
),
),
)
Request URL: /api/usuario
我不使用 CRUD 插件。 请帮忙?!
【问题讨论】:
每当收到错误时,请始终发布complete错误,即包括full堆栈跟踪 (最好从日志中以正确可读的方式复制),即使问题对于熟悉 CakePHP 的人来说可能很明显!另外,请务必提及您的 确切 CakePHP 版本(vendor/cakephp/cakephp/VERSION.txt
中的最后一行) - 谢谢!
【参考方案1】:
正如错误消息所述,该 URL 数组没有匹配的路由。每当遇到该错误时,请查看您的应用程序中连接了哪些路由 (bin/cake routes
),并检查错误堆栈跟踪以找出有问题的调用源于何处。在这种情况下,可以肯定地说它源于使用 loginAction
URL 数组的 auth 组件。
资源路由是特定于 HTTP 方法的
资源路由定义了匹配它们所需的 HTTP 请求方法。生成 URL 时,您必须通过 _method
选项键相应地提供方法,您的 loginAction
配置丢失,因此错误。
自定义资源端点的默认方法是GET
,所以你必须添加
'_method' => 'GET'
到您的loginAction
配置。但是,该方法与您的登录操作代码相矛盾,这需要POST
(您可以使用$this->request->allowMethod('post')
btw 而不是手动测试并引发异常)。因此,您必须更改自定义资源端点定义以映射到 POST
方法:
$routes->resources('Usuario', [
'map' => [
'login' => [
'controller' => 'Usuario',
'action' => 'login',
'method' => 'POST' // <<<<
]
]
]);
并相应地更改您的 loginAction
配置:
'loginAction' => [
'prefix' => 'api',
'controller' => 'Usuario',
'action' => 'login',
'plugin' => false,
'_method' => 'POST' // <<<<
],
ps.
摆弄$_POST
超全局似乎没有多大意义。一般来说,应该避免在 CakePHP 中访问超全局变量,因为它在某些时候很容易咬到你,尤其是在测试环境中。
应该不需要手动解析输入,请求处理程序组件应该处理它,假设您发送了正确的请求,即带有 .json
扩展名或正确的 Accept
标头。
另见
Cookbook > Request & Response Objects > Restricting Which HTTP method an Action Accepts Cookbook > Routing > Matching Specific HTTP Methods Cookbook > Routing > Creating RESTful Routes Cookbook > Routing > Mapping Additional Resource Routes Cookbook > Shells, Tasks & Console Tools > Routes Shell【讨论】:
非常感谢 ** @ndm ** !!它让我发疯,现在它运行良好。以上是关于Cakephp 3.x ADmad/JwtAuth MissingRouteException的主要内容,如果未能解决你的问题,请参考以下文章