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 的 sessionStorage
或 localStorage
来保存令牌。
however when I do this I get "message": "Action \"token\" has not been mapped"
为 token()
方法添加额外的路由,如图 here。
我在使用我的自定义身份验证方法连接 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 的 sessionStorage
或 localStorage
来保存令牌。
however when I do this I get
"message": "Action \"token\" has not been mapped"
为 token()
方法添加额外的路由,如图 here。