LoginController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. <?php
  2. declare (strict_types = 1);
  3. namespace App\Controller;
  4. use App\JsonRpc\UserServiceInterface;
  5. use App\Tools\CommonService;
  6. use App\Tools\PublicData;
  7. use App\Tools\Result;
  8. use Hyperf\Context\Context;
  9. use PHPStan\Type\Accessory\OversizedArrayType;
  10. use PHPUnit\Exception;
  11. use function Hyperf\Support\env;
  12. use Hyperf\Di\Annotation\Inject;
  13. use Hyperf\HttpServer\Annotation\AutoController;
  14. use Hyperf\Validation\Contract\ValidatorFactoryInterface;
  15. use \Phper666\JWTAuth\JWT;
  16. use App\Model\UserToken;
  17. use Hyperf\HttpServer\Response;
  18. use Hyperf\HttpMessage\Cookie\Cookie;
  19. /**
  20. * @AutoController()
  21. */
  22. class LoginController extends AbstractController
  23. {
  24. #[Inject]
  25. protected ValidatorFactoryInterface $validationFactory;
  26. /**
  27. * @var UserServiceInterface
  28. */
  29. #[Inject]
  30. private $userServiceClient;
  31. /**
  32. * @var Response
  33. */
  34. // private $response;
  35. // public function __construct(Response $response)
  36. // {
  37. // $this->response = $response;
  38. // }
  39. public function login(Jwt $jwt)
  40. {
  41. $reqData = $this->request->all();
  42. $validator = $this->validationFactory->make(
  43. $reqData,
  44. [
  45. 'username' => 'required',
  46. 'password' => 'required',
  47. 'type' => 'required',
  48. // 'code' => 'required',
  49. ],
  50. [
  51. 'username.required' => '用户名不能为空',
  52. 'password.required' => '密码不能为空',
  53. 'type.required' => '登录方式必填',
  54. // 'code.required' => 'code方式必填',
  55. ]
  56. );
  57. if ($validator->fails()) {
  58. $errorMessage = $validator->errors()->first();
  59. return Result::error($errorMessage);
  60. }
  61. // $comm = new CommonService();
  62. // $redis = $this->container->get(\Hyperf\Redis\Redis::class);
  63. // $code = $redis->get($reqData['code']);
  64. // if (empty($code)) {
  65. // return Result::error("验证码已过期");
  66. // }
  67. // if (strtolower($code) != strtolower($reqData['captcha'])) {
  68. // return Result::error("验证码错误");
  69. // }
  70. $where = [];
  71. if ($reqData['type'] == 1) { //密码登录
  72. $where = [
  73. 'user_name' => $reqData['username'],
  74. ];
  75. }
  76. $userInfos = $this->userServiceClient->verifyUserInfo($where);
  77. if ($userInfos['code'] == 0) {
  78. return Result::error("用户不存在");
  79. }
  80. if($userInfos['data']['status']==0){
  81. return Result::error("用户已经冻结");
  82. }
  83. if (md5(md5($reqData['password']) . $userInfos['data']['salt']) != $userInfos['data']['password']) {
  84. return Result::error("登陆密码错误");
  85. }
  86. if($userInfos['data']['type_id']!=10000){
  87. $authData = [
  88. 'id'=>$userInfos['data']['sszq'],
  89. 'SiteId'=>Context::get("SiteId")
  90. ];
  91. var_dump("参数:",$authData);
  92. $resultAuth = $this->checkUserAuth($authData);
  93. if(!$resultAuth){
  94. return Result::error("您没有权限登陆此网站");
  95. }
  96. }
  97. $userData = [
  98. 'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
  99. 'user_name' => $userInfos['data']['user_name'],
  100. 'mobile' => $userInfos['data']['mobile'],
  101. 'email' => $userInfos['data']['email'],
  102. 'level_id' => $userInfos['data']['level_id'],
  103. 'type_id' => $userInfos['data']['type_id'],
  104. ];
  105. // 使用默认场景登录
  106. $token = $jwt->getToken('default', $userData);
  107. // 检查是否有旧的token
  108. $old_token = UserToken::where('user_id', $userData['uid'])->first();
  109. if (!empty($old_token)) {
  110. $jwt->logout($old_token->token);
  111. try {
  112. $jwt->verifyToken($old_token->token);
  113. }catch (\Exception $exception){
  114. $code = $exception->getCode();
  115. if ($code== 400) {
  116. $new_token = UserToken::where('user_id', $userData['uid'])->update(['token' => $token->toString()]);
  117. if (empty($new_token)) {
  118. return Result::error("Token过期失败!");
  119. }
  120. } else{
  121. return Result::error("Token过期失败!");
  122. }
  123. }
  124. }else{
  125. $usernew_token = $token->toString();
  126. $user_token = UserToken::create([
  127. 'user_id' => $userData['uid'],
  128. 'token' => $usernew_token
  129. ]);
  130. if (empty($user_token)) {
  131. return Result::error("登录失败!");
  132. }
  133. }
  134. $data = [
  135. 'token' => $token->toString(),
  136. 'exp' => $jwt->getTTL($token->toString()),
  137. ];
  138. return Result::success($data);
  139. }
  140. /**
  141. * @return void
  142. */
  143. public function checkVerifyCode(Jwt $jwt)
  144. {
  145. //其它信息暂时不管 先以openid
  146. $reqData = $this->request->all();
  147. $validator = $this->validationFactory->make(
  148. $reqData,
  149. [
  150. 'token' => 'required',
  151. ],
  152. [
  153. 'token.required' => 'token不能为空',
  154. ]
  155. );
  156. if ($validator->fails()) {
  157. $errorMessage = $validator->errors()->first();
  158. return Result::error($errorMessage);
  159. }
  160. $userInfo = $jwt->getClaimsByToken($reqData['token']);
  161. if ($userInfo) {
  162. return Result::success(['token' => $reqData['token']]);
  163. } else {
  164. return Result::error("token无效");
  165. }
  166. }
  167. /**
  168. * 注册或登陆
  169. * @return void
  170. */
  171. public function registerOrLogin(Jwt $jwt)
  172. {
  173. //获取access_token
  174. $reqData = $this->request->all();
  175. $validator = $this->validationFactory->make(
  176. $reqData,
  177. [
  178. 'code' => 'required',
  179. ],
  180. [
  181. 'code.required' => 'code不能为空',
  182. ]
  183. );
  184. if ($validator->fails()) {
  185. $errorMessage = $validator->errors()->first();
  186. return Result::error($errorMessage);
  187. }
  188. $url = env("WECHAT") . "cgi-bin/token?appid=" . env("APPID") . "&secret=" . env("APP_SECRET") . "&grant_type=client_credential";
  189. $result = PublicData::http_get($url);
  190. $accessTokenData = json_decode($result, true);
  191. //获取openid
  192. $url = env("WECHAT") . "sns/jscode2session?appid=" . env("APPID") . "&secret=" . env("APP_SECRET") . "&js_code=" . $reqData['loginCode'] . "&grant_type=authorization_code";
  193. $result = PublicData::http_get($url);
  194. $openInfoData = json_decode($result, true);
  195. if (isset($openInfoData['errcode']) && in_array($openInfoData['errcode'], [40163, 40029])) {
  196. return Result::error($openInfoData['errmsg']);
  197. }
  198. $data = [
  199. 'code' => $reqData['code'],
  200. 'openid' => $openInfoData['openid'],
  201. ];
  202. // 将数组转换为JSON字符串
  203. $jsonData = json_encode($data);
  204. // 初始化cURL会话
  205. $ch = curl_init(env("WECHAT") . "wxa/business/getuserphonenumber?access_token=" . $accessTokenData['access_token']);
  206. // 设置cURL选项 Todo 这里有一万个wc 封装成post方法就报错,后期再研究
  207. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  208. curl_setopt($ch, CURLOPT_POST, true);
  209. curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
  210. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  211. 'Content-Type: application/json',
  212. 'Content-Length: ' . strlen($jsonData),
  213. ]);
  214. // 执行cURL会话
  215. $response = curl_exec($ch);
  216. // 检查是否有错误发生
  217. if (curl_errno($ch)) {
  218. return Result::error("获取手机号失败");
  219. }
  220. // 关闭cURL会话
  221. curl_close($ch);
  222. $response = json_decode($response, true);
  223. if ($response['errcode'] == '40029') {
  224. return Result::error($openInfoData['errmsg']);
  225. }
  226. // 打印响应内容
  227. var_dump($openInfoData, $response);
  228. //根据openid 获取token
  229. $checkUserInfo = $this->userServiceClient->verifyUserInfo([
  230. 'user_name' => $response['phone_info']['purePhoneNumber'],
  231. ]);
  232. if ($checkUserInfo['code'] == 0) {
  233. $salt = rand(1, 999999);
  234. $createUserData = [
  235. 'user_name' => $response['phone_info']['purePhoneNumber'],
  236. 'salt' => $salt,
  237. 'password' => $openInfoData['openid'],
  238. 'type_id' => 20000,
  239. ];
  240. $checkUserInfo = $this->userServiceClient->createUser($createUserData);
  241. }
  242. //根据openid和手机号判断是否注册,未注册直接注册
  243. $wechatReqData = [
  244. 'openid' => $openInfoData['openid'],
  245. 'purePhoneNumber' => $response['phone_info']['purePhoneNumber'],
  246. ];
  247. $wechatInfo = $this->userServiceClient->getWechatInfo($wechatReqData);
  248. if ($wechatInfo['code'] == 0) {
  249. $wechatData = [
  250. 'openid' => $openInfoData['openid'],
  251. 'phoneNumber' => $response['phone_info']['phoneNumber'],
  252. 'purePhoneNumber' => $response['phone_info']['purePhoneNumber'],
  253. 'countryCode' => $response['phone_info']['countryCode'],
  254. 'watermark' => json_encode($response['phone_info']['watermark']),
  255. 'user_id' => $checkUserInfo['data']['id'],
  256. ];
  257. $this->userServiceClient->addWechatInfo($wechatData);
  258. }
  259. var_dump($checkUserInfo);
  260. $userData = [
  261. 'uid' => $checkUserInfo['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
  262. 'user_name' => $response['phone_info']['phoneNumber'],
  263. 'mobile' => $checkUserInfo['data']['mobile'] ?? '',
  264. 'email' => $checkUserInfo['data']['email'],
  265. // 'rong_token' => $userInfos['data']['rong_token'],
  266. 'level_id' => $checkUserInfo['data']['level_id'],
  267. 'type_id' => $checkUserInfo['data']['type_id'],
  268. ];
  269. // 使用默认场景登录
  270. $token = $jwt->getToken('default', $userData);
  271. $data = [
  272. 'token' => $token->toString(),
  273. 'exp' => $jwt->getTTL($token->toString()),
  274. ];
  275. return Result::success($data);
  276. }
  277. public function getToken(JWT $jwt)
  278. {
  279. $reqData = $this->request->all();
  280. $userInfos = $this->userServiceClient->getUserInfo((int) $reqData['id']);
  281. $userData = [
  282. 'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
  283. 'user_name' => $userInfos['data']['user_name'],
  284. 'mobile' => $userInfos['data']['mobile'],
  285. 'email' => $userInfos['data']['email'],
  286. 'level_id' => $userInfos['data']['level_id'],
  287. 'type_id' => $userInfos['data']['type_id'],
  288. ];
  289. var_dump($userInfos);
  290. // 使用默认场景登录
  291. $token = $jwt->getToken('default', $userData);
  292. return Result::success($token->toString());
  293. }
  294. public function httpPost()
  295. {
  296. }
  297. # http头部必须携带token才能访问的路由
  298. public function getData(Jwt $jwt)
  299. {
  300. // var_dump($this->UserId);
  301. $h = $this->request->getHeaders();
  302. // var_dump($this->request->getHeaders());
  303. // $a= 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwaHBlcjY2Ni9qd3QiLCJ1aWQiOjMyLCJ1c2VyX25hbWUiOiIxIiwicm9sZV9pZCI6MSwibW9iaWxlIjoiMTU4MDEyNDU3NTUiLCJlbWFpbCI6IjVAcXEuY29tIiwicm9uZ190b2tlbiI6IiIsImxldmVsX2lkIjo4LCJqd3Rfc2NlbmUiOiJkZWZhdWx0IiwianRpIjoiZGVmYXVsdF82Njc1MjJkZDQ3YWYxMi41MTE5MjI5MiIsImlhdCI6MTcxODk1MjY2OSwibmJmIjoxNzE4OTUyNjY5LCJleHAiOjE3MjE1NDQ2Njl9.e0JW8fgNrwBdFgmQ8GNtES2ME1SbcbIih5MsQWzT6sk';
  304. $arr = $jwt->getClaimsByToken($h['token'][0]);
  305. var_dump($h['token'][0], "+++++++++++", $arr, "===####");
  306. return $this->response->json(['code' => 0, 'msg' => 'success', 'data' => ['a' => 1]]);
  307. }
  308. /**
  309. * 检测用户权限
  310. * @return void
  311. */
  312. public function checkUserAuth($data)
  313. {
  314. $websiteGroup = [
  315. 'id'=>$data['id']
  316. ];
  317. $result = $this->userServiceClient->getWebsiteGroupInfo($websiteGroup);
  318. if($result['code']==200){
  319. if($data['SiteId'] && $result['data']['web_ids']){
  320. if(in_array($data['SiteId'],json_decode($result['data']['web_ids'],true))){
  321. return true;
  322. }
  323. }else{
  324. return false;
  325. }
  326. }
  327. }
  328. /**
  329. * 查询登陆状态
  330. * @return array
  331. * @throws \Psr\Container\ContainerExceptionInterface
  332. * @throws \Psr\Container\NotFoundExceptionInterface
  333. * @throws \RedisException
  334. */
  335. public function loginStatus(Jwt $jwt)
  336. {
  337. $reqData = $this->request->all();
  338. $validator = $this->validationFactory->make(
  339. $reqData,
  340. [
  341. 'token' => 'required',
  342. ],
  343. [
  344. 'token.required' => 'token不能为空',
  345. ]
  346. );
  347. if ($validator->fails()) {
  348. $errorMessage = $validator->errors()->first();
  349. return Result::error($errorMessage);
  350. }
  351. try {
  352. $status = $jwt->verifyToken($reqData['token']);
  353. // var_dump("状态:",$status);
  354. return Result::success(['isLogin' => true]);
  355. }catch(\Exception $e){
  356. return Result::error('token已过期:'.$e->getMessage());
  357. }
  358. }
  359. /**
  360. *登陆
  361. * @return void
  362. */
  363. public function loginapi()
  364. {
  365. $reqData = $this->request->all();
  366. $validator = $this->validationFactory->make(
  367. $reqData,
  368. [
  369. 'token' => 'required',
  370. ],
  371. [
  372. 'token.required' => 'token不能为空',
  373. ]
  374. );
  375. if ($validator->fails()) {
  376. $errorMessage = $validator->errors()->first();
  377. return Result::error($errorMessage);
  378. }
  379. $redis = $this->container->get(\Hyperf\Redis\Redis::class);
  380. $ticket = md5($reqData['token']);
  381. $res = $redis->set('ticket:' . $ticket, $reqData['token'], 3600*24);
  382. if ($res){
  383. return Result::success(['ticket' => $ticket ,'isSave' => 1]);
  384. } else {
  385. return Result::error('存储失败');
  386. }
  387. }
  388. public function logoutapi(Jwt $jwt)
  389. {
  390. $reqData = $this->request->all();
  391. $validator = $this->validationFactory->make(
  392. $reqData,
  393. [
  394. 'token' => 'required',
  395. ],
  396. [
  397. 'token.required' => 'token不能为空',
  398. ]
  399. );
  400. if ($validator->fails()) {
  401. $errorMessage = $validator->errors()->first();
  402. return Result::error($errorMessage);
  403. }
  404. $redis = $this->container->get(\Hyperf\Redis\Redis::class);
  405. $ticket = md5($reqData['token']);
  406. $isDel = 0;
  407. if ($redis->exists('ticket:' . $ticket)) {
  408. $res = $redis->del('ticket:' . $ticket);
  409. if (!!$res && $res == 1) $isDel = 1;
  410. }else{
  411. $isDel = 1;
  412. }
  413. try {
  414. $jwt->logout($reqData['token']);
  415. }catch (\Exception $e){
  416. return Result::success(['isDel' => $isDel]);
  417. }
  418. return Result::success(['isDel' => $isDel]);
  419. }
  420. public function goLogin()
  421. {
  422. // 获取请求数据并设置默认值
  423. $reqData = $this->request->all();
  424. // 安全过滤 Admin-Token 和 ticket
  425. $cookieList = $this->request->getCookieParams();
  426. // 安全过滤 Admin-Token 和 ticket
  427. $adminToken = !empty($cookieList['Admin-Token']) ? $this->sanitizeInput($cookieList['Admin-Token']) : '';
  428. $ticket = !empty($reqData['ticket']) ? $this->sanitizeInput($reqData['ticket']) : '';
  429. $backurl = $this->sanitizeBackUrl($reqData['backurl'] ?? $_SERVER['HTTP_REFERER'] ?? '');
  430. // 校验 THE_HOST 环境变量
  431. $theHost = env("THE_HOST");
  432. if (empty($theHost)) {
  433. return Result::error('系统配置错误:THE_HOST 未定义');
  434. }
  435. var_dump("admintoken:",$adminToken);
  436. // 如果存在 adminToken,则进行登录校验
  437. if (!empty($adminToken)) {
  438. // 处理登录
  439. $redis = $this->container->get(\Hyperf\Redis\Redis::class);
  440. var_dump("ticket1111:",$ticket);
  441. if(!empty($ticket)){
  442. if (!empty($ticket) && $redis->exists('ticket:' . $ticket)) {
  443. $backurl = rtrim($backurl, '/');
  444. return $this->response->redirect($this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken)), 302);
  445. }else{
  446. var_dump("222222222:");
  447. return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/login?backurl='.urlencode($backurl)), 302);
  448. }
  449. }else{
  450. $ticket = md5($adminToken);
  451. }
  452. var_dump("333333333333333:");
  453. return $this->response->redirect($this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken)), 302);
  454. }else{
  455. var_dump("444444444444444:");
  456. return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/login?backurl='.urlencode($backurl)), 302);
  457. }
  458. }
  459. /**
  460. * 安全过滤输入数据
  461. * @param string $input
  462. * @return string
  463. */
  464. private function sanitizeInput(string $input): string
  465. {
  466. return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
  467. }
  468. /**
  469. * 校验并清理 backurl
  470. * @param string $backurl
  471. * @return string
  472. */
  473. private function sanitizeBackUrl(string $backurl): string
  474. {
  475. // 解码并去除多余字符
  476. $decodedUrl = urldecode($backurl);
  477. return filter_var($decodedUrl, FILTER_VALIDATE_URL) ?: '';
  478. }
  479. /**
  480. * 跳转到目标页面
  481. * @param string $backurl
  482. * @param string $ticket
  483. * @param string $adminToken
  484. */
  485. private function redirectWithTicket(string $backurl, string $ticket, string $adminToken)
  486. {
  487. $backurl = rtrim($backurl, '/');
  488. $redirectUrl = $this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken));
  489. // $loginUrl = 'http://' . $theHost . '/#/login?backurl=' . urlencode($backurl);
  490. // return $this->response->redirect($loginUrl, 302);
  491. return $this->response->redirect($redirectUrl, 302);
  492. }
  493. /**
  494. * 处理 URL
  495. * @param string $url
  496. * @return string
  497. */
  498. private function fun_http(string $url): string
  499. {
  500. // 确保 URL 以 http 或 https 开头
  501. if (!preg_match('/^https?:\/\//i', $url)) {
  502. $url = 'http://' . $url;
  503. }
  504. return $url;
  505. }
  506. /**
  507. * 退出
  508. * @return void
  509. */
  510. public function logout(Jwt $jwt)
  511. {
  512. $reqData = $this->request->all();
  513. $validator = $this->validationFactory->make(
  514. $reqData,
  515. [
  516. 'backurl' => 'required',
  517. 'admintoken' => 'required',
  518. ],
  519. [
  520. 'backurl.required' => 'backurl不能为空',
  521. 'admintoken.required' => 'admintoken不能为空',
  522. ]
  523. );
  524. if ($validator->fails()) {
  525. $errorMessage = $validator->errors()->first();
  526. return Result::error($errorMessage);
  527. }
  528. $redis = $this->container->get(\Hyperf\Redis\Redis::class);
  529. $ticket = md5($reqData['admintoken']);
  530. $res = $redis->del('ticket:' . $ticket);
  531. var_dump("删除redis:", $res);
  532. var_dump("获取redis:", $redis->get('ticket:' . $ticket));
  533. // 获取所有 Cookie
  534. $cookies = $this->request->getCookieParams();
  535. var_dump("获取cookie:", $cookies);
  536. if($cookies){
  537. foreach ($cookies as $name => $value) {
  538. if($name){
  539. $expire = time() - 3600; // 设置过期时间为过去的时间
  540. $cookie = new Cookie($name, '', $expire, '/');
  541. $this->response = $this->response->withCookie($cookie);
  542. }
  543. }
  544. }
  545. try {
  546. $jwt->logout($reqData['admintoken']);
  547. } catch (\Exception $e) {
  548. var_dump("返回错误信息:", $e->getMessage());
  549. }
  550. $backurl = $this->fun_http($reqData['backurl']);
  551. var_dump("返回地址:", $backurl);
  552. return $this->response->redirect($backurl, 302);
  553. }
  554. /**
  555. * 登录回调
  556. * @return void
  557. */
  558. public function backlogin()
  559. {
  560. $reqData = $this->request->all();
  561. var_dump("===============接收参数:",$reqData);
  562. $validator = $this->validationFactory->make(
  563. $reqData,
  564. [
  565. 'backurl' => 'required',
  566. 'token' => 'required',
  567. ],
  568. [
  569. 'backurl.required' => 'backurl不能为空',
  570. 'token.required' => 'token不能为空',
  571. ]
  572. );
  573. if ($validator->fails()) {
  574. $errorMessage = $validator->errors()->first();
  575. return Result::error($errorMessage);
  576. }
  577. $redis = $this->container->get(\Hyperf\Redis\Redis::class);
  578. $ticket = md5($reqData['token']);
  579. $res = $redis->set('ticket:' . $ticket, $reqData['token'], 3600*24);
  580. var_dump("===============返回值:",$res);
  581. $expire = time()+3600*24;
  582. $cookieName = 'Admin-Token';
  583. // 创建 Cookie 实例
  584. $cookie = new Cookie($cookieName, $reqData['token'], $expire, '/');
  585. // 清空 Cookie
  586. $r = $this->response = $this->response->withCookie($cookie);
  587. var_dump("设置token:", $r);
  588. if($res && !empty($ticket)){
  589. $url = $reqData['backurl'] . '/?ticket=' . $ticket . '&admintoken=' . urlencode($reqData['token']);
  590. $url = $this->fun_http($url);
  591. var_dump("跳转地址gogo:",$url);
  592. return $this->response->redirect($url, 302);
  593. }
  594. }
  595. }