使用sizeg / yii2-jwt创建一个JWToken是可行的。我可以将其发送给客户端。我会在下一个请求时从客户端取回它,可以验证令牌并可以从令牌访问用户数据。
在我的Apicontroller中
$behaviors['authenticator'] = [
'class' => \sizeg\jwt\JwtHttpBearerAuth::class,
'except' => ['login', 'logout', 'password'],
];
在我的用户模型中,我有代码
public static function findIdentityByAccessToken($token, $type = null)
{
if (preg_match('=^\d{1,6}$=', $token->getClaim('user')->id)) {
return new static($token->getClaim('user'));
}
return null;
}
现在在每个控制器中,我都可以使用
访问用户数据Yii::$app->user->id
Yii::$app->user->name
但是我如何访问令牌中的其他声明?我在令牌中提出了其他声明,例如,我将用户设备上的本地时间(可能在另一个时区)与服务器时间之间的时间差存储在声明“ tsDiff”中。当然,我可以再次读取并解析令牌
$token = Yii::$app->jwt->getParser()->parse((string) $jwtString);
$token->getClaim('tsDiff');
但是令牌已经被解析和验证以进行身份验证,两次进行验证没有多大意义。但是我不知道如何在控制器中的任何位置访问其他声明?
答案 0 :(得分:0)
您可以将令牌解析的结果存储在用户模型的属性中。比起您可以通过Yii::$app->user->identity
来获得它。
用户模型
class User extends Model implements IdentityInterface
{
protected $token;
public static function findIdentityByAccessToken($token, $type = null)
{
if (preg_match('=^\d{1,6}$=', $token->getClaim('user')->id)) {
$user = new static($token->getClaim('user'));
$user->token = $token;
return $user;
}
return null;
}
public function getToken()
{
return $this->token;
}
// ... other content of User model
}
然后您可以像这样访问控制器中的令牌:
public function actionMyAction()
{
$user = Yii::$app->user->identity;
if ($user instanceof \app\models\User) {
$tsDiff = $user->token->getClaim('tsDiff');
}
}