2022-06-16 18:29:58 +08:00

95 lines
2.5 KiB
PHP

<?php
namespace app\data\controller\api;
use app\data\service\UserAdminService;
use app\data\service\UserTokenService;
use think\admin\Controller;
use think\exception\HttpResponseException;
/**
* 接口授权认证基类
* Class Auth
* @package app\data\controller\api
*/
abstract class Auth extends Controller
{
/**
* 当前接口请求终端类型
* >>>>>>>>>>>>>>>>>>>>>>
* >>> api-name 接口类型
* >>> api-token 接口认证
* >>>>>>>>>>>>>>>>>>>>>>
* --- 手机浏览器访问 wap
* --- 电脑浏览器访问 web
* --- 微信小程序访问 wxapp
* --- 微信服务号访问 wechat
* --- 苹果应用接口访问 isoapp
* --- 安卓应用接口访问 android
* @var string
*/
protected $type;
/**
* 当前用户编号
* @var integer
*/
protected $uuid;
/**
* 当前用户数据
* @var array
*/
protected $user;
/**
* 控制器初始化
*/
protected function initialize()
{
// 检查接口类型
$this->type = $this->request->header('api-name');
if (empty($this->type)) $this->error("接口类型异常!");
if (!isset(UserAdminService::TYPES[$this->type])) {
$this->error("接口类型[{$this->type}]未定义!");
}
// 读取用户数据
$this->user = $this->getUser();
$this->uuid = $this->user['id'] ?? '';
if (empty($this->uuid)) {
$this->error('用户登录失败!', '{-null-}', 401);
}
}
/**
* 获取用户数据
* @return array
*/
protected function getUser(): array
{
try {
if (empty($this->uuid)) {
$token = $this->request->header('api-token');
if (empty($token)) $this->error('登录认证不能为空!');
[$state, $info, $this->uuid] = UserTokenService::check($this->type, $token);
if (empty($state)) $this->error($info, '{-null-}', 401);
}
return UserAdminService::get($this->uuid, $this->type);
} catch (HttpResponseException $exception) {
throw $exception;
} catch (\Exception $exception) {
trace_file($exception);
$this->error($exception->getMessage());
}
}
/**
* 显示用户禁用提示
*/
protected function checkUserStatus()
{
if (empty($this->user['status'])) {
$this->error('账户已被冻结!');
}
}
}