AuthorizationsController.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Exceptions\SmsException;
  4. use App\Models\AdminRole;
  5. use App\Models\User;
  6. use App\Services\SmsService;
  7. use App\Services\TencentImAccountService;
  8. use App\Transformers\UserTransformer;
  9. use Carbon\Carbon;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Auth;
  12. use Illuminate\Support\Facades\Hash;
  13. use Illuminate\Support\Facades\Validator;
  14. class AuthorizationsController extends Controller
  15. {
  16. protected $tencentImAccountService;
  17. public function __construct(TencentImAccountService $tencentImAccountService)
  18. {
  19. $this->tencentImAccountService = $tencentImAccountService;
  20. }
  21. /**
  22. * 手机号登录
  23. * @param Request $request
  24. * @return \Illuminate\Http\JsonResponse
  25. */
  26. public function loginByMobile(Request $request)
  27. {
  28. $validator = Validator::make($request->all(), [
  29. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  30. 'verifyKey' => 'bail|required|string',
  31. 'smsCode' => 'bail|required',
  32. ], [
  33. 'mobile.required'=>"手机号码必须",
  34. 'mobile.regex'=>"手机号码格式错误",
  35. 'verifyKey.required'=>"验证码必须",
  36. 'smsCode.required'=>"短信验证码必须",
  37. ]);
  38. if ($validator->fails()) {
  39. return $this->response()->errorForbidden($validator->messages()->first());
  40. }
  41. try {
  42. //验证短信验证码
  43. SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode);
  44. } catch (SmsException $e) {
  45. abort(403, $e->getMessage());
  46. } catch (\Exception $e) {
  47. abort(403, '短信校验失败');
  48. }
  49. $user = User::firstOrCreate([
  50. 'mobile' => $request->input('mobile'),
  51. ]);
  52. if (!$user->ycode) {
  53. $user->ycode = $this->createCode();
  54. }
  55. if (!$user->tencent_im_user_id) {
  56. $user->tencent_im_user_id = $this->tencentImAccountService->accountImport($user);
  57. }
  58. $user->save();
  59. $token = Auth::guard('api')->fromUser($user);
  60. self::updateLastLogin($user, $token);
  61. $resdata['token'] = $token;
  62. $resdata['sex'] = $user->sex;
  63. return response()->json($resdata)->setStatusCode(201);
  64. }
  65. /**
  66. * 根据用户ID生成唯一邀请码
  67. * @param $user_id
  68. * @return string
  69. */
  70. public function createCode() {
  71. $code = create_invite_code();
  72. if(User::where(['ycode'=>$code])->first()){
  73. $code = create_invite_code();
  74. }
  75. return $code;
  76. }
  77. /**
  78. * 用户账号密码登录
  79. * @param Request $request
  80. * @return \Illuminate\Http\JsonResponse|void
  81. */
  82. public function loginByAccountPassword(Request $request)
  83. {
  84. $validator = Validator::make($request->all(), [
  85. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  86. 'password' => 'required|string',
  87. ],[
  88. 'mobile.required'=>"手机号码必须",
  89. 'mobile.regex'=>"手机号码格式错误",
  90. 'password.required'=>"密码必须",
  91. ]);
  92. if ($validator->fails()) {
  93. return $this->response()->errorForbidden($validator->messages()->first());
  94. }
  95. if (!$user=User::where(['mobile' => $request->mobile])->first()) {
  96. return $this->response->errorNotFound('用户不存在!');
  97. }
  98. $credentials = $request->only('mobile', 'password');
  99. if (!$token = auth('api')->attempt($credentials)) {
  100. return $this->response->errorUnauthorized ('用户名或密码错误');
  101. }
  102. if (!$user->ycode) {
  103. $user->ycode = $this->createCode();
  104. }
  105. if (!$user->tencent_im_user_id) {
  106. $user->tencent_im_user_id = $this->tencentImAccountService->accountImport($user);
  107. }
  108. $user->save();
  109. self::updateLastLogin($user, $token);
  110. $resdata['token'] = $token;
  111. $resdata['sex'] = $user->sex;
  112. return response()->json($resdata)->setStatusCode(201);
  113. }
  114. /**
  115. * 注册账号
  116. */
  117. public function register(Request $request){
  118. $validator = Validator::make($request->all(), [
  119. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  120. 'password' => 'bail|required',
  121. ],[
  122. 'mobile.required'=>"手机号码必须",
  123. 'mobile.regex'=>"手机号码格式错误",
  124. 'password.required'=>"密码必须",
  125. ]);
  126. if ($validator->fails()){
  127. return $this->response()->errorForbidden($validator->messages()->first());
  128. }
  129. if(User::where(['mobile'=>$request->mobile])->first()){
  130. return $this->response->errorForbidden("该手机号码已使用");
  131. }
  132. $ins = array();
  133. if(isset($request->ycode) && $request->ycode!=""){
  134. if(!$puser = User::where(['ycode'=>$request->ycode])->first()){
  135. return $this->response->errorForbidden("邀请码不存在");
  136. }
  137. $ins['pid'] = $puser->id;
  138. }
  139. $ins['mobile'] = $request->mobile;
  140. $ins['password'] = $request->password;//
  141. $ins['ycode'] = $this->createCode();
  142. if(User::create($ins)){
  143. return response()->json(['message'=>"注册成功"])->setStatusCode(201);
  144. }else{
  145. return $this->response->errorForbidden("注册失败");
  146. }
  147. }
  148. /**
  149. * 忘记密码
  150. */
  151. public function forgetPassword(Request $request){
  152. $validator = Validator::make($request->all(), [
  153. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  154. 'verifyKey' => 'bail|required|string',
  155. 'smsCode' => 'bail|required',
  156. 'password' => 'bail|required',
  157. ],[
  158. 'mobile.required'=>"手机号码必须",
  159. 'mobile.regex'=>"手机号码格式错误",
  160. 'verifyKey.required'=>"验证码必须",
  161. 'smsCode.required'=>"短信验证码必须",
  162. 'password.required'=>"密码必须",
  163. ]);
  164. if ($validator->fails()) {
  165. return $this->response()->errorForbidden($validator->messages()->first());
  166. }
  167. try {
  168. //验证短信验证码
  169. SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode);
  170. } catch (SmsException $e) {
  171. abort(403, $e->getMessage());
  172. } catch (\Exception $e) {
  173. abort(403, '短信校验失败');
  174. }
  175. $user = User::where(['mobile'=>$request->mobile])->first();
  176. $user->password =$request->password;// Hash::make($request->password);
  177. if($user->save()){
  178. return $this->response->noContent()->setStatusCode(201);
  179. }
  180. }
  181. /**
  182. * Get the authenticated User.
  183. *
  184. * @return \Illuminate\Http\JsonResponse
  185. */
  186. public function me()
  187. {
  188. $user = auth('api')->user();
  189. return $this->response->item($user, new UserTransformer());
  190. }
  191. /**
  192. * Log the user out (Invalidate the token).
  193. *
  194. * @return \Illuminate\Http\JsonResponse
  195. */
  196. public function logout()
  197. {
  198. auth('api')->logout();
  199. return response()->json(['message' => 'Successfully logged out']);
  200. }
  201. /**
  202. * Refresh a token.
  203. * 刷新token,如果开启黑名单,以前的token便会失效。
  204. * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
  205. * @return \Illuminate\Http\JsonResponse
  206. */
  207. public function refresh()
  208. {
  209. return $this->respondWithToken(Auth::guard('api')->refresh());
  210. }
  211. static public function updateLastLogin(User $user, string $jwtToken)
  212. {
  213. $user->remember_token = $jwtToken;
  214. $user->last_login_time = Carbon::now();
  215. $user->last_login_ip = request()->ip();
  216. $user->save();
  217. }
  218. /**
  219. * Get the token array structure.
  220. *
  221. * @param string $token
  222. *
  223. * @return \Illuminate\Http\JsonResponse
  224. */
  225. protected function respondWithToken($token)
  226. {
  227. return response()->json([
  228. 'access_token' => $token,
  229. 'token_type' => 'Bearer',
  230. 'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
  231. ]);
  232. }
  233. }