6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php

102 lines
2.7 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers\Auth;
use App\Constants\Device;
use App\Endpoint\Api\Http\Controllers\Controller;
use App\Exceptions\BizException;
use App\Models\SmsCode;
use App\Models\User;
use App\Services\SmsCodeService;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class LoginController extends Controller
{
/**
* 登录
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function __invoke(Request $request)
{
$request->validate([
'type' => ['bail', 'filled'],
], [], [
'type' => '登录类型',
]);
$type = strtolower($request->input('type', 'password'));
$method = 'loginUsing'.Str::studly($type);
if (! method_exists($this, $method)) {
throw new BizException('登录类型 非法');
}
$user = $this->{$method}($request);
$user->checkStatus();
if ($type === 'password') {
if ($user->old_password) {
$user->password = $request->input('password');
$user->old_password = null;
}
}
$user->last_login_at = now();
$user->last_login_ip = $request->realIp();
$user->save();
$device = Device::UNIAPP;
// 清理此用户的商城端令牌
$user->tokens()->where('name', $device)->delete();
// 颁发新的商城端令牌
$token = $user->createToken($device, ['mall']);
return response()->json([
'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();
}
}