【问题标题】:Yii2 sizeg/yii2-jwt how to access jwt claims?Yii2 sizeg/yii2-jwt 如何访问 jwt 声明?
【发布时间】:2020-03-31 22:58:26
【问题描述】:

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

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

【问题讨论】:

    标签: yii2 jwt jwt-auth


    【解决方案1】:

    您可以将令牌解析的结果存储在用户模型的属性中。比你可以通过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');
        }
    }
    

    【讨论】:

    • 不起作用。但似乎我没有提供足够的信息。 class User 扩展 ActiveRecord 实现 IdentityInterface 由于 class user User 扩展 ActiveRecord 而不是 Model 似乎每个附加属性,不是数据库表的一部分。
    猜你喜欢
    • 2020-10-31
    • 2017-11-01
    • 2020-07-31
    • 2021-09-21
    • 2021-08-06
    • 2016-08-11
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多