Yii2 sizeg / yii2-jwt如何访问jwt声明?

时间:2019-12-06 23:57:25

标签: yii2 jwt jwt-auth

使用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');

但是令牌已经被解析和验证以进行身份​​验证,两次进行验证没有多大意义。但是我不知道如何在控制器中的任何位置访问其他声明?

1 个答案:

答案 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');
    }
}