76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace app\api\controller\openapi;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								use app\common\controller\Api;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								class Base extends Api
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    protected $noNeedLogin = '*';
							 | 
						|||
| 
								 | 
							
								    protected $noNeedRight = '*';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    protected $decrypt_data = [];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 初始化操作
							 | 
						|||
| 
								 | 
							
								     * @access protected
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    protected function _initialize()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        parent::_initialize();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $this->checkToken();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    public function checkToken()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        // token
							 | 
						|||
| 
								 | 
							
								        $key = $this->request->param('key/s',"");
							 | 
						|||
| 
								 | 
							
								        $encryption_data = $this->request->param('encryption_data/s',"");
							 | 
						|||
| 
								 | 
							
								        $sign = $this->request->param('sign/s',"");
							 | 
						|||
| 
								 | 
							
								        if (!$encryption_data) {
							 | 
						|||
| 
								 | 
							
								            $this->error('异常的调用');
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        //根据key查询公钥库
							 | 
						|||
| 
								 | 
							
								        $public_key = \app\common\model\auth\api\Key::where('key', $key)->value("public_key");
							 | 
						|||
| 
								 | 
							
								        if (!$public_key) {
							 | 
						|||
| 
								 | 
							
								            $this->error('非法访问!');
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        $decrypted = '';
							 | 
						|||
| 
								 | 
							
								        if (!openssl_public_decrypt(base64_decode($sign), $decrypted, $public_key)) {
							 | 
						|||
| 
								 | 
							
								            $this->error('非法访问!');
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        $sign_data = json_decode($decrypted, true);
							 | 
						|||
| 
								 | 
							
								        //取出时间戳
							 | 
						|||
| 
								 | 
							
								        $timestamp = $sign_data['timestamp'];
							 | 
						|||
| 
								 | 
							
								        //授权有效时间只有3分钟
							 | 
						|||
| 
								 | 
							
								        if (time() - $timestamp > 180) {
							 | 
						|||
| 
								 | 
							
								            $this->error('授权已过期');
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        //公钥解密加密数据
							 | 
						|||
| 
								 | 
							
								        if($encryption_data){
							 | 
						|||
| 
								 | 
							
								            $decrypt_data = '';
							 | 
						|||
| 
								 | 
							
								            if (!openssl_public_decrypt(base64_decode($encryption_data), $decrypt_data, $public_key)) {
							 | 
						|||
| 
								 | 
							
								                $this->error('非法访问!');
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            $this->decrypt_data = json_decode($decrypt_data, true);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //如果有当前服务器的token,塞入当前服务,重新加载父类_initialize方法
							 | 
						|||
| 
								 | 
							
								            if(!empty($this->decrypt_data['token'])){
							 | 
						|||
| 
								 | 
							
								                 $token = $this->decrypt_data['token'];
							 | 
						|||
| 
								 | 
							
								                 $this->auth->init($token);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								}
							 |