You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
5.1 KiB

<?php
declare (strict_types=1);
namespace app\middleware;
use jwt\Jwt;
class CheckApi
{
/**
* 处理请求
* @param \think\Request $request
* @param \Closure $next
* @param string $name auth--必须有openid user--必须有user_id
* @date 2021-01-13
*/
public function handle($request, \Closure $next, $name = 'auth')
{
$header = $request->header();
$access_token = isset($header['access-token']) ? $header['access-token'] : (isset($header['access_token']) ? $header['access_token'] : '');
$user_agent = isset($header['code-agent']) ? $header['code-agent'] : (isset($header['code_agent']) ? $header['code_agent'] : '');
$uid = isset($header['uid']) ? $header['uid'] : ''; //TODO
$JWT = new Jwt();
//定义用户代理商和UID
defined('ACCESS_TOKEN') || define('ACCESS_TOKEN', $access_token);
defined('USER_AGENT') || define('USER_AGENT', $user_agent);
defined('UID') || define('UID', $uid);
//鉴权由大面到细节
if (!UID) {
return sendErrorMessage(1006, 'uid缺失');
}
//解析token
if ($access_token) {
$res = $JWT->checkToken($access_token);
if ($res['code'] != 0) {
return sendErrorMessage(1002, 'token失效');
}
defined('TOKEN') || define('TOKEN', $res['data']); //ACCESS_TOKEN全部数据
$data = $res['data']['data'] ?? null; //获取解密数据
defined('TOKEN_DATA') || define('TOKEN_DATA', $data); //ACCESS_TOKEN的DATA数据
// access_token必须验证
if (!$access_token) {
return sendErrorMessage(1001, 'token缺失');
}
if ($data['uid'] != $uid) {
return sendErrorMessage(1003, 'uid与token不符');
}
}
//授权或者登录验证
if ($name == 'auth' || $name == 'user') {
switch (USER_AGENT) {
// APP
case 'app':
if (empty($data['device_id'])) {
return sendErrorMessage(1004, '尚未授权给APP');
}
defined('DEVICE_ID') || define('DEVICE_ID', $data['device_id']);
defined('APP_USER_ID') || define('APP_USER_ID', $data['app_user_id']);
break;
// 微信公众号
case 'weixin':
if (empty($data['openid']) || empty($data['wechat_user_id'])) {
return sendErrorMessage(1004, '尚未授权给公众号');
}
defined('OPENID') || define('OPENID', $data['openid']);
defined('WECHAT_USER_ID') || define('WECHAT_USER_ID', $data['wechat_user_id']);
break;
// 微信小程序
case 'mp_weixin':
if (empty($data['openid']) || empty($data['mpweixin_user_id'])) {
return sendErrorMessage(1004, '尚未授权给小程序');
}
defined('OPENID') || define('OPENID', $data['openid']);
defined('MPWEIXIN_USER_ID') || define('MPWEIXIN_USER_ID', $data['mpweixin_user_id']);
break;
// 抖音小程序
case 'mp_toutiao':
if (empty($data['openid']) || empty($data['mp_toutiao_user_id'])) {
return sendErrorMessage(1004, '尚未授权给小程序');
}
defined('OPENID') || define('OPENID', $data['openid']);
defined('MP_TOUTIAO_USER_ID') || define('MP_TOUTIAO_USER_ID', $data['mp_toutiao_user_id']);
break;
// QQ小程序
case 'mp_qq':
if (empty($data['openid']) || empty($data['mpqq_user_id'])) {
return sendErrorMessage(1004, '尚未授权给小程序');
}
defined('OPENID') || define('OPENID', $data['openid']);
defined('MPQQ_USER_ID') || define('MPQQ_USER_ID', $data['mpqq_user_id']);
break;
// 支付宝小程序
case 'mp_alipay':
if (empty($data['openid']) || empty($data['mpalipay_user_id'])) {
return sendErrorMessage(1004, '尚未授权给小程序');
}
defined('OPENID') || define('OPENID', $data['openid']);
defined('MPALIPAY_USER_ID') || define('MPALIPAY_USER_ID', $data['mpalipay_user_id']);
break;
default:
break;
}
}
//登录验证
// if ($name == 'user') {
// if (empty($data['user_id'])) {
// return sendErrorMessage(1005, '尚未登录');
// }
// }
//定义USER_ID
defined('USER_ID') || define('USER_ID', $access_token ? $data['user_id'] : '');
$response = $next($request);
return $response;
}
}