Laravel 是一个流行的 PHP 框架,都说其在许多方面都优雅之处,比如:
- 优雅的认证系统:Laravel 自带的认证系统提供了一种优雅的方式来处理用户登录和注册,开发人员只需几行代码即可实现这些功能。
- 优雅的路由定义:Laravel 提供了一种优雅而直观的方式来定义应用程序的路由,可以通过闭包或控制器方法来处理 HTTP 请求。
- 优雅的 ORM:Laravel 的 Eloquent ORM (对象关系映射) 具有简单、优雅且易于使用的语法,它可以让开发人员轻松地与数据库进行交互。
- 优雅的模板引擎:Laravel 的 Blade 模板引擎提供了一种轻量级、优雅的语法来创建和渲染视图,可以帮助开发人员更有效地组织和管理他们的模板。
- 优雅的任务调度:Laravel 的任务调度器提供了一种优雅的方式来调度后台任务,可以通过简单的代码定义和配置来执行任务。
- 优雅的测试工具:Laravel 提供了一套完整的测试工具和框架,可以帮助开发人员编写和运行各种类型的测试,包括单元测试、功能测试和浏览器测试等。
今天我们就以 Laravel Passport 为例,搭建一个SSO系统。
对于 Laravel 的认证系统,可以通过使用 Laravel Passport 这个包来构建一个基于 OAuth2 的单点登录(SSO)系统。下面是一些大致的步骤:
- 首先,在 Laravel 项目中安装 Laravel Passport 包,并按照官方文档进行配置。
- 接着,需要创建一个专门用于授权的 Passport 客户端。在 Laravel 中,可以使用
php artisan passport:client
命令来创建一个客户端。在创建时,需要指定客户端类型为“password”或“client_credentials”,具体类型取决于你的需求。在这里,我们将使用“password”类型,因为我们希望用户能够使用用户名和密码进行身份验证。 - 现在,我们需要修改 AuthServiceProvider 类中的 boot 方法,以使用 Passport 提供的 TokenGuard 来保护我们的应用程序路由。我们需要在此方法中添加以下代码:
IlluminateSupportFacadesAuth::viaRequest('api', function ($request) {
return LaravelPassportPassport::checkToken($request) ? auth()->user() : null;
});
- 接下来,我们需要创建一个路由来处理用户身份验证请求。可以使用 Laravel 自带的
AuthController
类来处理此请求。在此控制器中,我们需要使用 Passport 提供的issueToken
方法来颁发访问令牌。以下是一个示例方法:
public function authenticate(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$tokenResult = $user->createToken('Personal Access Token');
$accessToken = $tokenResult->accessToken;
return response()->json([
'access_token' => $accessToken,
'token_type' => 'Bearer',
'expires_at' => CarbonCarbon::parse(
$tokenResult->token->expires_at
)->toDateTimeString()
]);
} else {
return response()->json(['error' => 'Unauthenticated'], 401);
}
}
- 现在,我们需要在其他应用程序中使用这个认证系统。假设我们有一个名为“App2”的应用程序,现在我们需要修改该应用程序的身份验证逻辑,以使用我们刚才创建的 Passport 客户端来进行身份验证。以下是一个示例方法:
public function authenticate(Request $request)
{
$http = new GuzzleHttpClient;
try {
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => $request->username,
'password' => $request->password,
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
} catch (GuzzleHttpExceptionBadResponseException $e) {
if ($e->getCode() === 400) {
return response()->json('Invalid Request. Please enter a username or a password.', $e->getCode());
} else if ($e->getCode() === 401) {
return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
}
return response()->json('Something went wrong on the server.', $e->getCode());
}
}
这就是一个基本的 Laravel SSO 系统的搭建过程。当用户在一个应用程序中进行身份验证时,该系统将颁发一个访问令牌,并将其传递到其他应用程序中,使用户能够在这些应用程序中保持登录状态。