LoginController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Components\Helpers;
  4. use App\Http\Controllers\Controller;
  5. use App\Http\Models\User;
  6. use App\Http\Models\UserLabel;
  7. use App\Http\Models\UserSubscribe;
  8. use App\Http\Models\UserSubscribeLog;
  9. use Illuminate\Http\Request;
  10. use Response;
  11. use Cache;
  12. use Hash;
  13. use DB;
  14. /**
  15. * 登录接口
  16. *
  17. * Class LoginController
  18. *
  19. * @package App\Http\Controllers
  20. */
  21. class LoginController extends Controller
  22. {
  23. protected static $systemConfig;
  24. function __construct()
  25. {
  26. self::$systemConfig = Helpers::systemConfig();
  27. }
  28. // 登录返回订阅信息
  29. public function login(Request $request)
  30. {
  31. $username = trim($request->get('username'));
  32. $password = trim($request->get('password'));
  33. $cacheKey = 'request_times_' . md5(getClientIp());
  34. if (!$username || !$password) {
  35. Cache::increment($cacheKey);
  36. return Response::json(['status' => 'fail', 'data' => [], 'message' => '请输入用户名和密码']);
  37. }
  38. // 连续请求失败15次,则封IP一小时
  39. if (Cache::has($cacheKey)) {
  40. if (Cache::get($cacheKey) >= 15) {
  41. return Response::json(['status' => 'fail', 'data' => [], 'message' => '请求失败超限,禁止访问1小时']);
  42. }
  43. } else {
  44. Cache::put($cacheKey, 1, 60);
  45. }
  46. $user = User::query()->where('username', $username)->where('status', '>=', 0)->first();
  47. if (!$user) {
  48. Cache::increment($cacheKey);
  49. return Response::json(['status' => 'fail', 'data' => [], 'message' => '账号不存在或已被禁用']);
  50. } elseif (!Hash::check($password, $user->password)) {
  51. return Response::json(['status' => 'fail', 'data' => [], 'message' => '用户名或密码错误']);
  52. }
  53. DB::beginTransaction();
  54. try {
  55. // 如果未生成过订阅链接则生成一个
  56. $subscribe = UserSubscribe::query()->where('user_id', $user->id)->first();
  57. if (!$subscribe) {
  58. $code = $this->makeSubscribeCode();
  59. $subscribe = new UserSubscribe();
  60. $subscribe->user_id = $user->id;
  61. $subscribe->code = $code;
  62. $subscribe->times = 0;
  63. $subscribe->save();
  64. } else {
  65. $code = $subscribe->code;
  66. }
  67. // 更新订阅链接访问次数
  68. //$subscribe->increment('times', 1);
  69. // 记录每次请求
  70. //$this->log($subscribe->id, getClientIp(), 'API访问');
  71. // 订阅链接
  72. $url = self::$systemConfig['subscribe_domain'] ? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url'];
  73. // 节点列表
  74. $userLabelIds = UserLabel::query()->where('user_id', $user->id)->pluck('label_id');
  75. if (empty($userLabelIds)) {
  76. return Response::json(['status' => 'fail', 'message' => '', 'data' => []]);
  77. }
  78. $nodeList = DB::table('ss_node')
  79. ->selectRaw('ss_node.*')
  80. ->leftJoin('ss_node_label', 'ss_node.id', '=', 'ss_node_label.node_id')
  81. ->whereIn('ss_node_label.label_id', $userLabelIds)
  82. ->where('ss_node.status', 1)
  83. ->groupBy('ss_node.id')
  84. ->orderBy('ss_node.sort', 'desc')
  85. ->orderBy('ss_node.id', 'asc')
  86. ->get();
  87. $c_nodes = collect();
  88. foreach ($nodeList as $node) {
  89. $temp_node = [
  90. 'name' => $node->name,
  91. 'server' => $node->server,
  92. 'server_port' => $user->port,
  93. 'method' => $user->method,
  94. 'obfs' => $user->obfs,
  95. 'flags' => $url . '/assets/images/country/' . $node->country_code . '.png',
  96. 'obfsparam' => '',
  97. 'password' => $user->passwd,
  98. 'group' => '',
  99. 'protocol' => $user->protocol,
  100. 'protoparam' => '',
  101. 'protocolparam' => ''
  102. ];
  103. $c_nodes = $c_nodes->push($temp_node);
  104. }
  105. $data = [
  106. 'status' => 1,
  107. 'class' => 0,
  108. 'level' => 2,
  109. 'expire_in' => $user->expire_time,
  110. 'text' => '',
  111. 'buy_link' => '',
  112. 'money' => '0.00',
  113. 'sspannelName' => 'ssrpanel',
  114. 'usedTraffic' => flowAutoShow($user->u + $user->d),
  115. 'Traffic' => flowAutoShow($user->transfer_enable),
  116. 'all' => 1,
  117. 'residue' => '',
  118. 'nodes' => $c_nodes,
  119. 'link' => $url . '/s/' . $code
  120. ];
  121. DB::commit();
  122. return Response::json(['status' => 'success', 'data' => $data, 'message' => '登录成功']);
  123. } catch (\Exception $e) {
  124. DB::rollBack();
  125. return Response::json(['status' => 'success', 'data' => [], 'message' => '登录失败']);
  126. }
  127. }
  128. // 写入订阅访问日志
  129. private function log($subscribeId, $ip, $headers)
  130. {
  131. $log = new UserSubscribeLog();
  132. $log->sid = $subscribeId;
  133. $log->request_ip = $ip;
  134. $log->request_time = date('Y-m-d H:i:s');
  135. $log->request_header = $headers;
  136. $log->save();
  137. }
  138. }