我欲乘风九万里
梦的起点
心灵之声
珊瑚礁
编码之舞
梦中的微风
项目编码
聚合登录文档
建议
AI助手
项目初始化-中间件封装
```php <?php namespace app\middleware; use lib\exception\ApiException; use app\model\AppModel; use ReflectionClass; use support\Log; use Webman\Http\Request; use Webman\Http\Response; use Webman\MiddlewareInterface; /** * @desc 全局中间件 */ class api implements MiddlewareInterface { public function process(Request $request, callable $handler) : Response { $return = [ 'code' => 500, 'msg' => '' ]; // 创建一个反射类 $reflectionClass = new ReflectionClass($request->controller); $noCheck = $reflectionClass->getDefaultProperties()['noCheck'] ?? true; //默认需要验证 $checkAction = $reflectionClass->getDefaultProperties()['checkAction'] ?? []; //需要验证的方法集合 // 接口鉴权 if ( !$noCheck || in_array($request->action, $checkAction)) { $sign = $this->check($request); if($sign !== true) { $return['msg'] = $sign; Log::info($sign,$request->all()); return json($return); } } $reflectionMethod = $reflectionClass->getMethod($request->action); // 获取方法的反射 $methodParameters = $reflectionMethod->getParameters(); // 获取方法的参数 $paramsArray = []; //所有参数 foreach ($methodParameters as $parameter) { $paramName = $parameter->getName(); $paramValue = $request->input($paramName); if ($paramValue === null || $paramValue === '') { if (!$parameter->isDefaultValueAvailable()) { // 如果方法参数没有默认值 $return['msg'] = '缺少必要参数: ' . $paramName; return json($return); } else { $paramsArray[] = $parameter->getDefaultValue(); // 使用方法参数的默认值 } } else { $paramsArray[] = $paramValue; // 使用从请求中获取的参数值 } } // 调用方法并传递参数 try { $res = $reflectionMethod->invokeArgs($reflectionClass->newInstance(), $paramsArray); # 特殊返回 redirect_uri代表重定向,header代表输出图片,其他正常返回 if(!empty($res['redirect_uri'])) { return redirect($res['redirect_uri']); } else if (!empty($res['header'])) { return \response($res['res'])->header('Content-Type', $res['header']); } else { $return['code'] = 200; $return['data'] = $res; } } catch (ApiException $e) { $return['line'] = $e->getLine(); $return['msg'] = $e->getMessage(); $return['file'] = $e->getFile(); Log::error($e->getMessage(),[$request->all(),$return]); } catch (\Exception $e) { // 处理异常,你可以将异常信息记录到日志或返回适当的错误响应 $return['file'] = $e->getFile(); $return['line'] = $e->getLine(); $return['msg'] = $e->getMessage(); $return['trace'] = $e->getTraceAsString(); Log::error($e->getMessage(),[$request->all(),$return]); } return json($return); } /** * @desc 鉴权 * @param $token * @return true */ public function check(Request $request) { if(!empty($request->header('Authorization')) || in_array($request->header('origin'),['http://127.0.0.1:8789',getenv('DOMAIN')])) { return $this->checkAuth($request->header('Authorization')); } else { return $this->checkApp($request); } } /** * token鉴权 * @param $token * @return true */ public function checkAuth($token) { return true; } /** * 第三方鉴权 * @param Request $request * @return string|true * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function checkApp(Request $request) { $param = $request->all(); if(empty($param['app_id'])) return '缺少app_id'; if(empty($param['timestamp'])) return '缺少timestamp'; $timeDiff = time() - $param['timestamp']; if($timeDiff > 120 || $timeDiff < 120) return '请求超时'; $appSecret = AppModel::where('app_id',$param['app_id'])->find(); if(empty($appSecret) || $appSecret->is_del == 2) return '应用不存在'; if($appSecret->status !== 1) return '应用已禁用'; $sign = $param['sign']; unset($param['sign']); $str = ''; ksort($param); foreach ($param as $k => $v) { if (is_array($v)) { $str .= $k . '=' . json_encode($v) . '&'; } elseif (is_bool($v)) { $str .= $k . '=' . ($v ? "true" : "false") . '&'; } elseif($v) { $str .= $k . '=' . $v . '&'; } } $sign2 = md5($str . $appSecret->app_secret); if($sign === $sign2){ return true; } else { return '签名错误'; } } } ```
ysian
我雾化科所
1
聚合登录之创建应用篇
2024-07-30
645
0
2
php函数之match
2024-07-29
583
0
3
聚合登录之常见问题
2024-07-30
489
0
4
聚合登录之前后端示例代码
2024-07-30
483
0
5
聚合登录之获取登录链接
2024-07-30
422
0
6
服务器瘦身
2023-11-01
414
5
7
centos下升级openssl
2023-11-30
414
0
8
我的第一篇博客
2023-09-28
403
0
9
supervisor的安装与使用
2023-11-02
384
0
10
editor.md 代码块没有下拉框
2023-10-06
353
2
PHP [9]
linux [4]
sh [1]
闲谈 [1]
css [2]
redis [2]
Cluster集群 [1]
git [1]
centos [1]
webman [2]
工具 [1]
OAuth2.0 [1]
项目 [1]
初始化 [1]
thinkphp [1]
Nginx [1]
往事 [1]
Mysql [1]
支付宝 [2]
抖音 [2]
qq [2]
聚合 [1]
登录 [1]
聚合登录 [4]
cache [1]
html [1]
queue [1]
Workerman版本
4.1.15
Webman版本
1.5.9
PHP版本
8.3.6
MYSQL版本
8.2.24
操作系统
CENTOS