Yii2项目中如何使用JWT?

Posted

技术标签:

【中文标题】Yii2项目中如何使用JWT?【英文标题】:How to use JWT in Yii2 project? 【发布时间】:2017-11-01 02:07:52 【问题描述】:

在我的 REST API 中,我想使用 JWT 来进行授权。

所以,我添加了这个扩展 - https://github.com/sizeg/yii2-jwt

清楚如何创建JWT令牌,但是如何在API端验证令牌?我的心,我必须使用两个令牌 - auth_token 和 refresh_token。为了什么?验证和检查用户有什么不同?

我的意思是 - 好的,当我收到用户名和密码时,我创建 auth_token (JWT) 并在用户数据库中更新令牌,然后将令牌返回到前端。

在前端将在每个请求中发送身份验证令牌后,我将验证令牌并检查用户数据库中的用户并检查访问权限等。如何实现刷新令牌以及用于什么?

例如我的控制器:

class UploadController extends Controller 

    public $serializer = [
        'class' => 'yii\rest\Serializer',
        'collectionEnvelope' => 'items',
    ];

    public function behaviors()
    
        $behaviors = parent::behaviors();

        $behaviors['authenticator'] = [
            'class' => JwtHttpBearerAuth::className()
        ];

        return $behaviors;
    

    public function actionIndex() 

       //Work with User
    

以及如何从标头中获取令牌?

【问题讨论】:

有解决办法吗? 你有什么发现吗?你认为为github.com/sizeg/yii2-jwt 或github.com/firebase/php-jwt 做一个扩展可能有用吗? 我刚刚找到一个使用 (lcobucci/jwt)[github.com/sizeg/yii2-jwt] 任何想法? 【参考方案1】:

控制器

public function actionLogin()


    $username = Yii::$app->request->post('username');
    $password = Yii::$app->request->post('password');

    $provider = new ActiveDataProvider([
        'query' => User::find()
                ->where(['user_name' => $username])->asArray()->one(),
    ]);

    $result = $provider->query;

    if($result)
    
        if (Yii::$app->getSecurity()->validatePassword($password, $result['user_pass'])) 
        
            $tokenId    = base64_encode(mcrypt_create_iv(32));
            $issuedAt   = time();
            $notBefore  = $issuedAt;             //Adding 10 seconds
            $expire     = $notBefore + 5184000;            // Adding 60 Days
            $serverName = 'your-site.com';
            $data = [
                'iat'  => $issuedAt,         // Issued at: time when the token was generated
                'jti'  => $tokenId,          // Json Token Id: an unique identifier for the token
                'iss'  => $serverName,       // Issuer
                'nbf'  => $notBefore,        // Not before
                'exp'  => $expire,           // Expire
                'data' => [                  // Data related to the signer user
                    'id' => $result['user_id'],
                    'username' => $result['user_name'],
                    'mobile' => $result['user_mobile'],
                    'email' => $result['user_email'],
                    'city' => $result['user_city'],
                    'state' => $result['user_state'],
                    'country' => $result['user_country'],
                    'picture' => $result['user_picture'],
                ]
            ];

            $jwt = JWT::encode(
                $data,     
                JWT_KEY, 
                'HS512'  
            );

            $response = [
                'status' => true,
                'message' => 'Login Success..',
                'era_tkn' => $jwt,
            ];
         
        else 
        
            $response = [
                'status' => false,
                'message' => 'Wrong username or password.',
            ];
        
    
    else
    
        $response = [
            'status' => false,
            'message' => 'Wrong username or password.',
        ];
    

    return $response;

为检查令牌制作全局方法

public function check_token()

    $headers = Yii::$app->request->headers;
    $token = $headers->get('era_tkn');
    if($token)
    
        try
        $valid_data = JWT::decode($token, JWT_KEY, array('HS512'));
        $valid_data = $valid_data->data;

        catch(Exception $e)
            $valid_data = $e->getMessage();
        
    
    else
    
        $valid_data = 'Required Authentication';
    

    return $valid_data;

调用 check_token 方法

$user_data = $this->check_token();
    if (!empty($user_data->id))
    
        echo $user_data->id;
    
    else
    
       echo "Invalid Token.";
    

【讨论】:

请提供 JWT 供应商/包或资源@vijay-makwana 作曲家需要 firebase/php-jwt

以上是关于Yii2项目中如何使用JWT?的主要内容,如果未能解决你的问题,请参考以下文章

如何在库项目中测试Yii2模型?

如何在yii2的预先模板中使用faker

如何在Yii2中使用查询

如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列

如何在 yii2 中使用 select2 小部件选择多个值

Yii2 JWT