1

我在我的应用程序中使用CakePHP 3.6JWT Auth启用基于令牌的身份验证,前端是用Angular 6.

我的登录控制器就像

<?php
namespace App\Controller\Api;

use Cake\Event\Event;
use Cake\Http\Exception\UnauthorizedException;
use Cake\Utility\Security;
use Crud\Controller\Component\CrudComponent;
use Firebase\JWT\JWT;

class UsersController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->Auth->allow(['add', 'token']);
    }

    public function token()
    {
        $user = $this->Auth->identify();
        if (!$user) {
            throw new UnauthorizedException('Invalid username or password');
        }

        $this->set([
            'success' => true,
            'data' => [
                'token_type' => 'Bearer',
                'expires_in' => 604800,
                'token' => JWT::encode([
                    'sub' => $user['id'],
                    // 'exp' => time() + 604800
                ],
                    Security::getSalt())
            ],
            '_serialize' => ['success', 'data']
        ]);
    }
}

AppController.php内容

命名空间 App\Controller\Api;

<?php
use Cake\Controller\Controller;

class AppController extends Controller
{
    use \Crud\Controller\ControllerTrait;

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Crud.Crud', [
            'actions' => [
                'Crud.Index',
                'Crud.View',
                'Crud.Add',
                'Crud.Edit',
                'Crud.Delete'
            ],
            'listeners' => [
                'Crud.Api',
                'Crud.ApiPagination'
            ]
        ]);

        $this->loadComponent('Auth', [
            'storage' => 'Memory',
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ],
                    'finder' => 'auth'
                ],
                'ADmad/JwtAuth.Jwt' => [
                    'parameter' => 'token',
                    'userModel' => 'Users',
                    'finder' => 'auth',
                    'fields' => [
                        'username' => 'id'
                    ],
                    'queryDatasource' => true
                ]
            ],
            'unauthorizedRedirect' => false,
            'checkAuthIn' => 'Controller.initialize'
        ]);
    }

}

在从角度应用程序发送请求以生成令牌时工作正常并收到以下响应。

在此处输入图像描述

但是当使用令牌将请求发送到其他端点时会出现错误

401: Unauthorized access

在此处输入图像描述

请求/响应标头有令牌

在此处输入图像描述

我试过什么?

  • 我尝试在生成访问令牌时禁用exp 。
  • 尝试在 CakePHP 应用程序中禁用调试。

当 CakePHP 服务器应用程序在本地运行时,它工作得很好。

4

2 回答 2

1

在你的 .htaccess 中试试这个规则(如果 mod_rewrite 被激活):

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

使用 LAMP 的 Bitnami 堆栈(例如在 EC2 AWS 实例上),php-fdm 模块过滤每个请求的标头,并且“授权”标头被搞砸了。

使用这一行,您可以强制使用原始 Authorization 标头创建 $_HTTP 变量。

问候

于 2018-09-19T06:25:28.887 回答
0

如果您在标题中收到 AUTHORIZATION,请检查 cakephp 代码。

于 2019-06-15T10:40:26.513 回答