CakePHP 3.x + CRUD + 具有自定义身份验证的 JWT

CakePHP 3.x + CRUD + JWT with custom Authentication

我在使用我的自定义身份验证方法连接 FriendsOfCake CRUD + JWT 时遇到问题(例如,没有像我想的那样使用内置的 Cake3 PasswordHasher)。

我尽可能地遵循 http://www.bravo-kernel.com/2015/04/how-to-add-jwt-authentication-to-a-cakephp-3-rest-api/,但我的设置不同之处在于我永远不会通过 API 注册用户,我只需要针对用户名生成一个令牌,并且密码。

我可以使用下面的函数生成令牌(有一些注意事项)

但是我有两个问题:

1) 我如何使用令牌?它似乎没有被添加到会话中,我如何在发出令牌后将其包含在每个请求中?

2) 根据 bravo-kernel 文章,应该将 token 方法添加到 UsersController,但是当我这样做时,我得到

"message": "Action \"token\" has not been mapped",

然后,如果我将它映射到一个 CRUD 方法(例如 Add),它就可以工作,但它也会在我的用户 table 中创建一个空白行,这真的不是我想要的。

令牌方法是:

public function token()
{
    if($this->request->is('post')) {


        //returns $user object or false
        $query = $this->Users->_checkUser($this->request->query);

        if ($query) {
            $this->set('data', [
                'id' => $query->id,
                'token' => $token = \JWT::encode(
                    [
                        'id' => $query->id,
                        'exp' => time() + 604800
                    ],
                    Security::salt())
            ]);

            $this->Crud->action()->config('serialize.data', 'data');


        } else {
            throw new UnauthorizedException('Invalid username or password');
        }
    }
    return $this->Crud->execute();
}

除了上述 link 之外,我正在努力寻找任何示例,因此非常感谢任何关于我哪里出错的提示:)

I will only need to generate a token against the username and password.

因此您的 token() 方法需要验证凭据,如果有效 return 则需要令牌作为响应。您链接的教程中的 token() 方法正是这样做的。

1) What do I do with the Token? It doesn't seem to be added to the Session, how do I have this included in each request after the token is issued?

基于令牌的身份验证是无状态的,因此不使用会话,客户端应该保存令牌以用于传递所有请求。例如您可以使用 HTML5 的 sessionStoragelocalStorage 来保存令牌。

however when I do this I get "message": "Action \"token\" has not been mapped"

token() 方法添加额外的路由,如图 here