<?php namespace App\Http\Controllers\Api; use App\Http\Requests\UserRegister; use App\Models\UserModel; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Foundation\Auth\ThrottlesLogins; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cookie; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Redis; use Illuminate\Support\Facades\Validator; class AuthApiController extends Controller { use ThrottlesLogins, RegistersUsers; public function register(UserRegister $request) { $email = $request->input('email'); if (UserModel::where('email', $email)->exists()) { return $this->setError('Email has been taken'); } //判断邮箱验证码 $redisKey = 'sem_email_code_register_' . $email; $cachedEmailCode = Redis::get($redisKey); if ($cachedEmailCode != $request->input('email_code')) { return $this->setError('Email code invalid'); } $userId = UserModel::createUser($request->all()); Redis::del($redisKey); \Auth::loginUsingId($userId); return $this->setSuccess('Register success'); } public function login(Request $request) { $validator = Validator::make($request->all(), [ 'email' => 'required|string|email|max:255', 'password' => 'required|string|min:8', ], [ 'password.min' => 'Password must be at least 8 characters long.' ]); if ($validator->fails()) { return $this->setError($validator->errors()->first()); } $userExists = UserModel::where('email', $request->email)->exists(); if (!$userExists) { return $this->setError('User dose not exist'); } if ($this->attemptLogin($request)) { $request->session()->regenerate(); Cookie::queue('sem_email', Auth::user()->email, config('session.lifetime')); return $this->setSuccess('Login success'); } $this->incrementLoginAttempts($request); return $this->setError('Login failure'); } public function logout(Request $request) { Auth::logout(); return $this->setSuccess('Logout success'); } public function resetPassword(Request $request) { $validator = Validator::make($request->all(), [ 'old_password' => 'required|min:8', 'password' => ['required', 'string', 'min:8', 'confirmed'], ], [ 'old_password.min' => 'Password must be at least 8 characters long.', 'password.min' => 'Password must be at least 8 characters long.', 'password.confirmed' => 'Passwords do not match!', ]); if ($validator->fails()) { return $this->setError($validator->errors()->first()); } $password = $request->get('password'); $oldPassword = $request->get('old_password'); $userId = Auth::user()->id; $hashedPassword = UserModel::where('id', $userId)->value('password'); if (!Hash::check($oldPassword, $hashedPassword)) { return $this->setError('Wrong Password!'); } $user = UserModel::find($userId); $user->password = Hash::make($password); $user->update_time = time(); $result = $user->save(); if (!$result) { return $this->setError('Reset password failed'); } return $this->setSuccess('Reset password success'); } public function forgetPassword(Request $request) { $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'email_code' => 'required' ], []); if ($validator->fails()) { return $this->setError($validator->errors()->first()); } $email = $request->input('email'); $emailCode = $request->input('email_code'); $redisKey = 'sem_email_code_forget_password' . '_' . $email; $cachedEmailCode = Redis::get($redisKey); if ($cachedEmailCode != $emailCode) { return $this->setError('Email code invalid'); } return $this->setSuccess('Verify email code success'); } //忘记密码以后的设置密码 public function setForgetPassword(Request $request) { $validator = Validator::make($request->all(), [ 'password' => ['required', 'string', 'min:8', 'confirmed'], 'email_code' => 'required', 'email' => 'required|email' ], []); $password = $request->input('password'); $emailCode = $request->input('email_code'); $email = $request->input('email'); if ($validator->fails()) { return $this->setError($validator->errors()->first()); } $redisKey = 'sem_email_code_forget_password' . '_' . $email; $cachedEmailCode = Redis::get($redisKey); if (!$cachedEmailCode) { return $this->setError('Email code expired'); } if ($cachedEmailCode != $emailCode) { return $this->setError('Email code invalid'); } $user = UserModel::where('email', $email)->first(); $user->password = Hash::make($password); $user->update_time = time(); $result = $user->save(); if (!$result) { return $this->setError('Reset password failed'); } Redis::del($redisKey); Auth::logout(); return $this->setSuccess('Reset password success'); } //发送邮箱验证码 public function sendEmailCode(Request $request) { $email = $request->input('email'); $type = $request->input('type', 'register'); $validator = Validator::make($request->all(), [ 'email' => 'required|email', ]); if ($validator->fails()) { return $this->setError($validator->errors()->first()); } $info = UserModel::where('email', $email)->first(); switch ($type) { case 'register': if ($info) { return $this->setError('This email had been registered'); } case 'forget_password' : $existEmail = UserModel::where('email', $email)->exists(); if (!$existEmail) { return $this->setError('This email is not registered'); } } //发送验证码 $code = mt_rand(1000, 9999); $redisKey = 'sem_email_code_' . $type . '_' . $email; if (Redis::get($redisKey)) { return $this->setError('Email code had been sent'); } Redis::set($redisKey, $code); Redis::expire($redisKey, 120); $subject = config('mail.from.name'); $msg = 'Email Code:' . $code . '.'; return $this->setSuccessData($code); Mail::raw($msg, function ($message) use ($email, $subject) { $message->to($email)->subject($subject); }); //错误处理 if (count(Mail::failures())) { return $this->setError('Email code send failed'); } return $this->setSuccess('Email code send success'); } }