2026年03月30日/ 浏览 22
正文:
在分布式系统架构中,单点登录(SSO)是解决多应用间用户身份统一认证的关键技术。Laravel作为流行的PHP框架,结合OAuth2或JWT等协议,能够高效实现SSO功能。本文将分步骤解析实现方案,并提供可直接落地的代码示例。
SSO的核心在于共享认证中心。当用户首次登录时,认证中心颁发令牌(Token),其他子系统通过验证该令牌实现免登。常见实现方式有两种:
1. 基于Session的共享:适用于同域场景,通过共享Cookie实现。
2. 基于Token的授权:如JWT或OAuth2,适合跨域环境。
Laravel推荐使用Token方案,因其灵活性和安全性更高。
本文以JWT为例,需安装以下依赖:
composer require tymon/jwt-auth
配置.env文件:
JWT_SECRET=your_random_key_here
认证中心负责生成和验证JWT令牌。在routes/api.php中定义登录接口:
Route::post('/login', function (Request $request) {
$credentials = $request->only('email', 'password');
if (!$token = auth()->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return response()->json(['token' => $token]);
});
子系统需拦截请求并验证Token。创建中间件VerifyJWTToken.php:
public function handle($request, Closure $next) {
try {
$token = $request->header('Authorization');
if (!$user = JWTAuth::parseToken()->authenticate()) {
return response()->json(['error' => 'Invalid token'], 401);
}
} catch (\Exception $e) {
return response()->json(['error' => 'Token expired'], 403);
}
return $next($request);
}
通过CORS中间件允许跨域请求,并在前端存储Token:
axios.interceptors.request.use(config => {
config.headers.Authorization = localStorage.getItem('sso_token');
return config;
});
jwt-blacklist插件处理注销场景。 通过以上步骤,Laravel应用可快速接入SSO体系。实际项目中还需结合Redis缓存用户状态、日志监控等增强稳定性。