2022-11-06 11:28:22 +00:00
|
|
|
<?php
|
|
|
|
|
2022-11-16 05:16:56 +00:00
|
|
|
namespace App\Http\Controllers\Web;
|
2022-11-06 11:28:22 +00:00
|
|
|
|
|
|
|
// use App\Helpers\ApiResponse;
|
|
|
|
|
2022-11-16 05:16:56 +00:00
|
|
|
use App\Http\Controllers\Controller;
|
2023-01-17 17:29:00 +00:00
|
|
|
use App\Notifications\User\UserNotification;
|
2023-02-07 09:04:11 +00:00
|
|
|
use function back;
|
|
|
|
use function config;
|
2023-01-10 13:42:27 +00:00
|
|
|
use Illuminate\Http\RedirectResponse;
|
2022-11-06 11:28:22 +00:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
2023-02-02 05:51:32 +00:00
|
|
|
use Illuminate\Support\Facades\Cache;
|
2023-01-10 13:42:27 +00:00
|
|
|
use Illuminate\View\View;
|
2022-11-16 05:16:56 +00:00
|
|
|
use function redirect;
|
|
|
|
use function session;
|
|
|
|
use function view;
|
2022-11-06 11:28:22 +00:00
|
|
|
|
|
|
|
class AuthController extends Controller
|
|
|
|
{
|
2023-01-10 13:42:27 +00:00
|
|
|
public function index(Request $request): View|RedirectResponse
|
2022-11-06 11:28:22 +00:00
|
|
|
{
|
|
|
|
// if logged in
|
2023-01-14 21:37:25 +00:00
|
|
|
if ($request->filled('callback')) {
|
|
|
|
$callback = $request->input('callback');
|
2022-11-06 11:28:22 +00:00
|
|
|
|
2023-01-14 21:37:25 +00:00
|
|
|
session(['callback' => $callback]);
|
|
|
|
|
|
|
|
if (Auth::guard('web')->check()) {
|
|
|
|
$callbackHost = parse_url($callback, PHP_URL_HOST);
|
|
|
|
$dashboardHost = parse_url(config('settings.dashboard.base_url'), PHP_URL_HOST);
|
|
|
|
|
|
|
|
if ($callbackHost === $dashboardHost) {
|
2023-02-07 09:04:11 +00:00
|
|
|
if (! Auth::guard('web')->user()->isRealNamed()) {
|
2023-01-15 00:32:50 +00:00
|
|
|
return redirect()->route('real_name.create')->with('status', '重定向已被打断,需要先实人认证。');
|
|
|
|
}
|
|
|
|
|
2023-01-14 21:37:25 +00:00
|
|
|
$token = $request->user()->createToken('Dashboard')->plainTextToken;
|
|
|
|
|
2023-02-07 09:04:11 +00:00
|
|
|
return redirect($callback.'?token='.$token);
|
2023-01-14 21:37:25 +00:00
|
|
|
}
|
2022-11-06 11:28:22 +00:00
|
|
|
|
2022-11-28 15:58:39 +00:00
|
|
|
return redirect()->route('confirm_redirect');
|
2022-11-06 11:28:22 +00:00
|
|
|
} else {
|
|
|
|
return redirect()->route('login');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return view('index');
|
|
|
|
}
|
|
|
|
|
2023-01-10 13:42:27 +00:00
|
|
|
public function confirm_redirect(Request $request): View
|
2022-11-28 15:58:39 +00:00
|
|
|
{
|
|
|
|
$callback = $request->callback ?? session('callback');
|
|
|
|
|
|
|
|
return view('confirm_redirect', compact('callback'));
|
|
|
|
}
|
|
|
|
|
2023-02-02 04:55:48 +00:00
|
|
|
public function update(Request $request): RedirectResponse
|
|
|
|
{
|
|
|
|
$request->validate([
|
|
|
|
'name' => 'required|string|max:255',
|
|
|
|
]);
|
|
|
|
|
|
|
|
$user = $request->user('web');
|
|
|
|
|
|
|
|
$user->update([
|
|
|
|
'name' => $request->input('name'),
|
|
|
|
]);
|
|
|
|
|
|
|
|
return back()->with('success', '更新成功。');
|
|
|
|
}
|
|
|
|
|
2023-01-10 13:42:27 +00:00
|
|
|
public function newToken(Request $request): RedirectResponse
|
2022-11-06 11:28:22 +00:00
|
|
|
{
|
|
|
|
$request->validate([
|
2023-02-02 12:58:31 +00:00
|
|
|
'name' => 'required|string|max:255',
|
2022-11-06 11:28:22 +00:00
|
|
|
]);
|
|
|
|
|
2023-02-02 12:58:31 +00:00
|
|
|
$token = $request->user()->createToken($request->input('name'));
|
2022-11-06 11:28:22 +00:00
|
|
|
|
|
|
|
return back()->with('token', $token->plainTextToken);
|
|
|
|
}
|
|
|
|
|
2023-01-10 13:42:27 +00:00
|
|
|
public function deleteAll(Request $request): RedirectResponse
|
2022-11-06 11:28:22 +00:00
|
|
|
{
|
2023-01-17 17:29:00 +00:00
|
|
|
$user = $request->user('web');
|
|
|
|
|
|
|
|
$user->tokens()->delete();
|
|
|
|
$user->notify(new UserNotification('莱云', '您的所有 Token 已被删除。'));
|
2022-11-06 11:28:22 +00:00
|
|
|
|
|
|
|
return back()->with('success', '所有 Token 删除成功。');
|
|
|
|
}
|
|
|
|
|
2023-01-10 13:42:27 +00:00
|
|
|
public function logout(): RedirectResponse
|
2022-11-06 11:28:22 +00:00
|
|
|
{
|
|
|
|
Auth::guard('web')->logout();
|
|
|
|
|
|
|
|
session()->regenerateToken();
|
|
|
|
|
|
|
|
return redirect()->route('index');
|
|
|
|
}
|
2023-02-02 05:51:32 +00:00
|
|
|
|
2023-02-02 11:18:16 +00:00
|
|
|
public function exitSudo(): RedirectResponse
|
|
|
|
{
|
|
|
|
session()->forget('auth.password_confirmed_at');
|
|
|
|
|
2023-02-02 12:46:22 +00:00
|
|
|
return back();
|
2023-02-02 11:18:16 +00:00
|
|
|
}
|
|
|
|
|
2023-02-02 05:51:32 +00:00
|
|
|
public function showAuthRequest($token): View|RedirectResponse
|
|
|
|
{
|
2023-02-07 09:04:11 +00:00
|
|
|
$data = Cache::get('auth_request:'.$token);
|
2023-02-02 05:51:32 +00:00
|
|
|
|
|
|
|
if (empty($data)) {
|
|
|
|
return redirect()->route('index')->with('error', '登录请求的 Token 不存在或已过期。');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($data['user'])) {
|
|
|
|
return redirect()->route('index')->with('error', '登录请求的 Token 已被使用。');
|
|
|
|
}
|
|
|
|
|
2023-02-02 06:08:25 +00:00
|
|
|
// 登录后跳转的地址
|
|
|
|
session(['url.intended' => route('auth_request.show', $token)]);
|
|
|
|
|
2023-02-02 05:51:32 +00:00
|
|
|
return view('auth.request', [
|
|
|
|
'data' => $data,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function storeAuthRequest(Request $request): RedirectResponse
|
|
|
|
{
|
|
|
|
$request->validate([
|
|
|
|
'token' => 'required|string|max:128',
|
|
|
|
]);
|
|
|
|
|
2023-02-07 09:04:11 +00:00
|
|
|
$data = Cache::get('auth_request:'.$request->input('token'));
|
2023-02-02 05:51:32 +00:00
|
|
|
|
|
|
|
if (empty($data)) {
|
|
|
|
return back()->with('error', '登录请求的 Token 不存在或已过期。');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($data['user'])) {
|
|
|
|
return back()->with('error', '登录请求的 Token 已被使用。');
|
|
|
|
}
|
|
|
|
|
|
|
|
$data['user'] = $request->user('web');
|
|
|
|
|
2023-02-07 09:04:11 +00:00
|
|
|
Cache::put('auth_request:'.$request->input('token'), $data, 60);
|
2023-02-02 05:51:32 +00:00
|
|
|
|
|
|
|
return redirect()->route('index')->with('success', '登录请求已确认。');
|
|
|
|
}
|
2022-11-06 11:28:22 +00:00
|
|
|
}
|