首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP 3 JWT-8月给出401个未经授权的错误

CakePHP 3 JWT-8月给出401个未经授权的错误
EN

Stack Overflow用户
提问于 2018-09-12 02:52:38
回答 2查看 1.2K关注 0票数 1

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

我的登录控制器就像

代码语言:javascript
复制
<?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;

代码语言:javascript
复制
<?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'
        ]);
    }

}

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

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

代码语言:javascript
复制
401: Unauthorized access

请求/响应头具有令牌

我试过什么?

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-19 06:25:28

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

代码语言:javascript
复制
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

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

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

问候

票数 1
EN

Stack Overflow用户

发布于 2019-06-15 10:40:26

如果在标头中收到授权,请签入cakephp代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52286806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档