LoginController.php 3.9 KB

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