AuthController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\BindMobileRequest;
  5. use App\Http\Requests\MobileLoginRequest;
  6. use App\Http\Requests\WeappAuthorizationRequest;
  7. use App\Http\Requests\WeappUserinfoRequest;
  8. use App\Maps\CacheMap;
  9. use App\Models\Area;
  10. use App\Models\Auth;
  11. use App\Models\User;
  12. use App\Models\UserPhoneDetail;
  13. use App\Repositories\ConfigRepository;
  14. use App\Repositories\InviteNewUserRepository;
  15. use App\Repositories\UserRepository;
  16. use App\Transformers\UserTransformer;
  17. use Carbon\Carbon;
  18. use Illuminate\Support\Facades\Cache;
  19. use Tymon\JWTAuth\Facades\JWTAuth;
  20. /**
  21. * 小程序权限认证模块
  22. * Class AuthController
  23. * @package App\Http\Controllers\V1
  24. */
  25. class AuthController extends Controller
  26. {
  27. protected $jwt;
  28. protected $userRepository;
  29. /**
  30. * Create a new controller instance.
  31. *
  32. * @return void
  33. */
  34. public function __construct(JWTAuth $jwt, UserRepository $userRepository)
  35. {
  36. $this->jwt = $jwt;
  37. $this->userRepository = $userRepository;
  38. }
  39. /**
  40. * 小程序认证
  41. * @param WeappAuthorizationRequest $request
  42. * User: Mead
  43. */
  44. public function weappLogin(WeappAuthorizationRequest $request, ConfigRepository $configRepository, InviteNewUserRepository $inviteNewUserRepository)
  45. {
  46. try {
  47. $code = $request->code;
  48. $appid = $request->appid;
  49. $invite_user_id = $request->get('invite_user_id') ?? 0;
  50. $miniProgram = app('wechat.mini_program');
  51. $data = $miniProgram->auth->session($code);
  52. if (isset($data['errcode'])) {
  53. $this->response->errorUnauthorized('code 不正确');
  54. return '';
  55. }
  56. $auth = Auth::where('identifier', $appid)->where('credential', $data['openid'])->first();
  57. $is_auth = true;
  58. if (!$auth) {
  59. //注册用户
  60. $userInfo = $this->userRepository->getRandomUserInfo();
  61. $userInfo['register_source'] = User::REGISTER_SOURCE_WEAPP;
  62. $user = User::create($userInfo);
  63. //添加邀请注册活动
  64. if ((int)$invite_user_id != 0) {
  65. $inviteNewUserRepository->create($invite_user_id, $user->id);
  66. }
  67. //注册认证信息
  68. $attributes['type'] = Auth::TYPE_WEAPP;
  69. $attributes['identifier'] = $appid;
  70. $attributes['credential'] = $data['openid'];
  71. $attributes['user_id'] = $user->id;
  72. $attributes['is_verified'] = Auth::VERIFIED_OK;
  73. $auth = Auth::create($attributes);
  74. $is_auth = false;
  75. } else {
  76. $user = $this->userRepository->byIdGetModel($auth->user_id);
  77. }
  78. $phone_detail = $request->get('phone_detail') ?? '';
  79. if (!empty($phone_detail)) {
  80. $detail = json_decode($phone_detail);
  81. if (!empty($detail)) {
  82. UserPhoneDetail::Log($detail, $user->id);
  83. }
  84. }
  85. $token = JWTAuth::fromUser($user);
  86. // 单机登录限制
  87. app()->redis->hset(CacheMap::SINGLE_LOGIN_API, $user->id, $token);
  88. return $this->response->array([
  89. 'is_auth' => $is_auth,
  90. 'token' => 'Bearer ' . $token,
  91. 'session_key' => $data['session_key'],
  92. 'exp' => Carbon::now()->addMinute(JWTAuth::factory()->getTTL())->getTimestamp(),
  93. 'auth_id' => $auth->id,
  94. 'user' => $is_auth ? $user : [],
  95. 'android_mini_version' => $configRepository->getMiniAndroidVersion(),
  96. 'ios_mini_version' => $configRepository->getMiniIosVersion(),
  97. ]);
  98. } catch (\Exception $exception) {
  99. return $this->errorNoValidation($exception->getMessage());
  100. }
  101. }
  102. /**
  103. * mobileLogin 手机号登录
  104. *
  105. * @param MobileLoginRequest $request
  106. * @param ConfigRepository $configRepository
  107. * @return void
  108. * @author Fx
  109. *
  110. */
  111. public function mobileLogin(MobileLoginRequest $request, ConfigRepository $configRepository)
  112. {
  113. try {
  114. $mobile = $request->get('mobile');
  115. $code = $request->get('code');
  116. $v_code = Cache::get("verification_code_{$mobile}", '');
  117. if (empty($v_code)) {
  118. return $this->errorNoValidation('验证码已过期');
  119. }
  120. if ((string)$v_code !== (string)$code) {
  121. return $this->errorNoValidation('验证码错误');
  122. }
  123. $user = User::query()->where('mobile', $mobile)->first();
  124. $is_auth = true;
  125. if (empty($user)) {
  126. return $this->errorNoValidation('找不到该用户,或用户没有绑定此手机号');
  127. }
  128. //注册认证信息
  129. $auth = Auth::query()->where('user_id', $user->id)->first();
  130. if (!$auth) {
  131. $is_auth = false;
  132. }
  133. $phone_detail = $request->get('phone_detail') ?? '';
  134. if (!empty($phone_detail)) {
  135. $detail = json_decode($phone_detail);
  136. if (!empty($detail)) {
  137. UserPhoneDetail::Log($detail, $user->id);
  138. }
  139. }
  140. $token = JWTAuth::fromUser($user);
  141. // 单机登录限制
  142. app()->redis->hset(CacheMap::SINGLE_LOGIN_API, $user->id, $token);
  143. return $this->response->array([
  144. 'token' => 'Bearer ' . $token,
  145. 'exp' => Carbon::now()->addMinute(JWTAuth::factory()->getTTL())->getTimestamp(),
  146. 'auth_id' => $auth->id ?? '',
  147. 'user' => $is_auth ? $user : [],
  148. 'android_mini_version' => $configRepository->getMiniAndroidVersion(),
  149. 'ios_mini_version' => $configRepository->getMiniIosVersion(),
  150. ]);
  151. } catch (\Exception $exception) {
  152. return $this->errorNoValidation($exception->getMessage());
  153. }
  154. }
  155. /**
  156. * 更新用户基本信息
  157. * User: Mead
  158. */
  159. public function weappUserInfoSync(WeappUserinfoRequest $request)
  160. {
  161. try {
  162. $this->user->fill([
  163. 'nickname' => $request->get('nickName'),
  164. 'gender' => $request->get('gender', 0),
  165. 'country' => $request->get('country', null),
  166. 'province' => $request->get('province', null),
  167. 'city' => $request->get('city', null),
  168. 'avatar' => $request->get('avatarUrl', null) ?? "http://resource.weilaibike.com/avatarUrlDefault.jpeg",
  169. 'language' => $request->get('language', 'zh_CN'),
  170. 'register_area_id' => $request->get('area_id', 0),
  171. 'register_area' => $request->get('area_id', 0) ? Area::where('id', $request->get('area_id', 0))->value('name') : null,
  172. 'is_register' => User::REGISTER_OK
  173. ]);
  174. $this->user->save();
  175. return $this->response->item($this->user, UserTransformer::class);
  176. } catch (\Exception $exception) {
  177. $this->response->error($exception->getMessage(), 401);
  178. }
  179. }
  180. /**
  181. * 获取当前登录用户
  182. * @return \Dingo\Api\Http\Response
  183. * User: Mead
  184. */
  185. public function loginUser()
  186. {
  187. try {
  188. return $this->response->item($this->user, UserTransformer::class);
  189. } catch (\Exception $exception) {
  190. return $this->errorNoValidation($exception->getMessage());
  191. }
  192. }
  193. }