6
0
Fork 0

短信验证码登录

release
李静 2022-03-30 11:35:17 +08:00
parent b4dae3373b
commit 745ba98708
3 changed files with 61 additions and 9 deletions

View File

@ -5,9 +5,12 @@ namespace App\Endpoint\Api\Http\Controllers\Auth;
use App\Constants\Device; use App\Constants\Device;
use App\Endpoint\Api\Http\Controllers\Controller; use App\Endpoint\Api\Http\Controllers\Controller;
use App\Exceptions\BizException; use App\Exceptions\BizException;
use App\Models\SmsCode;
use App\Models\User; use App\Models\User;
use App\Models\UserInfo; use App\Models\UserInfo;
use App\Services\SmsCodeService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Str;
class LoginController extends Controller class LoginController extends Controller
{ {
@ -19,21 +22,29 @@ class LoginController extends Controller
*/ */
public function __invoke(Request $request) public function __invoke(Request $request)
{ {
$validated = $request->validate([ $request->validate([
'phone' => ['bail', 'required', 'string'], 'type' => ['bail', 'filled'],
'password' => ['bail', 'required', 'string'], ], [], [
'type' => '登录类型',
]); ]);
$user = User::where('phone', $validated['phone'])->first(); $type = strtolower($request->input('type', 'password'));
if (! $user?->verifyPassword($validated['password'])) { $method = 'loginUsing'.Str::studly($type);
throw new BizException(__('Incorrect account or password'));
if (! method_exists($this, $method)) {
throw new BizException('登录类型 非法');
} }
if ($user->old_password) { $user = $this->{$method}($request);
$user->password = $validated['password'];
$user->old_password = null; if ($type === 'password') {
if ($user->old_password) {
$user->password = $request->input('password');
$user->old_password = null;
}
} }
$user->last_login_at = now(); $user->last_login_at = now();
$user->last_login_ip = $request->realIp(); $user->last_login_ip = $request->realIp();
$user->save(); $user->save();
@ -75,4 +86,42 @@ class LoginController extends Controller
'token' => $token->plainTextToken, 'token' => $token->plainTextToken,
]); ]);
} }
protected function loginUsingPassword(Request $request)
{
$validated = $request->validate([
'phone' => ['bail', 'required', 'string'],
'password' => ['bail', 'required', 'string'],
], [], [
'phone' => '手机号',
'password' => '密码',
]);
$user = User::where('phone', $validated['phone'])->first();
if (! $user?->verifyPassword($validated['password'])) {
throw new BizException(__('Incorrect account or password'));
}
return $user;
}
protected function loginUsingVerifyCode(Request $request)
{
$validated = $request->validate([
'phone' => ['bail', 'required', 'string'],
'verify_code' => ['bail', 'required', 'string'],
], [], [
'phone' => '手机号',
'verify_code' => '验证码',
]);
app(SmsCodeService::class)->validate(
$validated['phone'],
SmsCode::TYPE_LOGIN,
$validated['verify_code']
);
return User::where('phone', $validated['phone'])->firstOrFail();
}
} }

View File

@ -15,6 +15,7 @@ class SmsCode extends Model
public const TYPE_REGISTER = 1; public const TYPE_REGISTER = 1;
public const TYPE_RESET_PASSWORD = 2; public const TYPE_RESET_PASSWORD = 2;
public const TYPE_SET_WALLET_PASSWORD = 3; public const TYPE_SET_WALLET_PASSWORD = 3;
public const TYPE_LOGIN = 4;
/** /**
* @var array * @var array
@ -53,6 +54,7 @@ class SmsCode extends Model
self::TYPE_REGISTER, self::TYPE_REGISTER,
self::TYPE_RESET_PASSWORD, self::TYPE_RESET_PASSWORD,
self::TYPE_SET_WALLET_PASSWORD, self::TYPE_SET_WALLET_PASSWORD,
self::TYPE_LOGIN,
]; ];
/** /**

View File

@ -53,6 +53,7 @@ class SmsCodeService
break; break;
case SmsCode::TYPE_LOGIN:
case SmsCode::TYPE_RESET_PASSWORD: case SmsCode::TYPE_RESET_PASSWORD:
case SmsCode::TYPE_SET_WALLET_PASSWORD: case SmsCode::TYPE_SET_WALLET_PASSWORD:
if ($user === null) { if ($user === null) {