單點登入(SSO)讓用戶在多個子系統間一次登入、處處可用。本文基於 Laravel 框架,以三個二級域名為例,詳細實作 Ticket 驗證流程、全局中間件攔截與緩存同步機制。
登入成功後生成 Ticket 存入緩存(120 秒),重定向回目標系統:
private function getTicketUrl($source) {
$ticket = md5(time() . $key);
Cache::put($ticket, $user, 120);
return $source . '?ticket=' . $ticket;
}
App\Http\Middleware\CasAuthenticate 攔截請求,驗證 Ticket:
public function handle($request, Closure $next) {
$ticket = $request->input('ticket');
if ($ticket) {
$result = json_decode(file_get_contents('https://a.baidu.com/auth/check-ticket?ticket=' . $ticket), true);
if ($result['state'] == 'SUCCESS') {
$request->session()->flush();
Auth::loginUsingId($result['result']['uid']);
return redirect($request->url());
}
}
return $next($request);
}
本文提供基礎實作思路,實際項目請根據安全性與擴展性需求進一步完善。