JWT 身份验证 - 为新注册的用户请求令牌时遇到问题

Posted

技术标签:

【中文标题】JWT 身份验证 - 为新注册的用户请求令牌时遇到问题【英文标题】:JWT Authentication - Having trouble requesting the Token for a newly registered User 【发布时间】:2017-10-23 16:47:56 【问题描述】:

我正在尝试将 JWT 身份验证添加到我的 cakephp3 Rest API,遵循此 tutorial

在我的 UsersController.php 文件中创建 /register 操作并注册新用户后,我无法验证令牌请求。 (由于我正在制作的应用程序类型,我已将“用户”一词更改为“艺术家”)。因此,在注册了新的艺术家(用户)后,我会看到一个 201 状态代码,表示它是成功的,因此给了我该艺术家(用户)的“令牌”。然后我通过浏览到http://jwt.io/ 并将令牌粘贴到其中来验证这一点,这也向我显示成功。展望未来,我现在尝试在我的ArtistsController.php 文件中实现 JWT 令牌请求,方法是通过 JSON 发布艺术家(用户)的电子邮件和密码来请求令牌。这是我的ArtistsController.php 代码:

<?php
namespace App\Controller\Api;
use App\Controller\Api\AppController;
use Cake\Event\Event;
use Cake\Network\Exception\UnauthorizedException;
use Cake\Utility\Security;
use Firebase\JWT\JWT;

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

    //Artists registration
    public function add()
    
        $this->Crud->on('afterSave', function(Event $event) 
            if ($event->subject->created) 
                $this->set('data', [
                    'id' => $event->subject->entity->id,
                    'token' => JWT::encode(
                        [
                            'sub' => $event->subject->entity->id,
                            'exp' =>  time() + 604800
                        ],
                    Security::salt())
                ]);
                $this->Crud->action()->config('serialize.data', 'data');
            
        );
        return $this->Crud->execute();
     

    //Verify Token request
    public function token()
    
        $artist = $this->Auth->identify();
        if (!$artist) 
            throw new UnauthorizedException('Invalid email or password');
        
        $this->set([
            'success' => true,
            'data' => [
                'token' => JWT::encode([
                    'sub' => $artist['id'],
                    'exp' =>  time() + 604800
                ],
                Security::salt())
            ],
            '_serialize' => ['success', 'data']
        ]);
    

    public $paginate = [
        'page' => 1,
        'limit' => 500,
        'maxLimit' => 500,
        'contain' => ['Parlours', 'Tags']
    ];

当我尝试通过为新创建的艺术家(用户)请求令牌来验证设置时,使用 API 测试工具 CocoaRestClient 将 JSON 数据发布到我的 API,它显示:


    "message": "Invalid email or password",
    "url": "/api/artists/token",
    "code": 401

即使凭据有效且正确。我对我的数据库和代码上的所有内容进行了两次和三次检查,没有遗漏任何小东西,例如我的 API 测试工具中的逗号。为了确定,我什至注册了一位新艺术家(用户)。在现在尝试请求令牌之前,一切都是成功的(即使已经创建并验证了令牌)。

以前有人遇到过这个问题吗?

理论上它应该可以工作,因为电子邮件和密码是有效的,但它根本就没有。

【问题讨论】:

@RogarSSD,请帮我回答这个问题***.com/questions/47995364/… 【参考方案1】:

您是否更改了 AppController.php 中关于 Artist Model 的 auth 组件配置,即 'userModel' => 'Artists'

【讨论】:

有效!谢谢你。我一直在扯头发这么久!你是明星! @Sebastian 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。谢谢。

以上是关于JWT 身份验证 - 为新注册的用户请求令牌时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

每个请求的 JWT 令牌验证?

如何在 api 请求标头中插入 api 身份验证所需的 jwt 令牌?

JWT 从 Laravel 中的令牌中检索经过身份验证的用户

Sailsjs 基于 jwt 令牌的身份验证示例

在刷新身份验证令牌时处理多个未经授权的请求

使用JWT身份验证缓存API请求