Laravel 的优雅之处 之,Passport搭建SSO系统

2023-06-13 12:31:33 浏览数 (4)

Laravel 是一个流行的 PHP 框架,都说其在许多方面都优雅之处,比如:

  • 优雅的认证系统:Laravel 自带的认证系统提供了一种优雅的方式来处理用户登录和注册,开发人员只需几行代码即可实现这些功能。
  • 优雅的路由定义:Laravel 提供了一种优雅而直观的方式来定义应用程序的路由,可以通过闭包或控制器方法来处理 HTTP 请求。
  • 优雅的 ORM:Laravel 的 Eloquent ORM (对象关系映射) 具有简单、优雅且易于使用的语法,它可以让开发人员轻松地与数据库进行交互。
  • 优雅的模板引擎:Laravel 的 Blade 模板引擎提供了一种轻量级、优雅的语法来创建和渲染视图,可以帮助开发人员更有效地组织和管理他们的模板。
  • 优雅的任务调度:Laravel 的任务调度器提供了一种优雅的方式来调度后台任务,可以通过简单的代码定义和配置来执行任务。
  • 优雅的测试工具:Laravel 提供了一套完整的测试工具和框架,可以帮助开发人员编写和运行各种类型的测试,包括单元测试、功能测试和浏览器测试等。

今天我们就以 Laravel Passport 为例,搭建一个SSO系统。

对于 Laravel 的认证系统,可以通过使用 Laravel Passport 这个包来构建一个基于 OAuth2 的单点登录(SSO)系统。下面是一些大致的步骤:

  1. 首先,在 Laravel 项目中安装 Laravel Passport 包,并按照官方文档进行配置。
  2. 接着,需要创建一个专门用于授权的 Passport 客户端。在 Laravel 中,可以使用 php artisan passport:client 命令来创建一个客户端。在创建时,需要指定客户端类型为“password”或“client_credentials”,具体类型取决于你的需求。在这里,我们将使用“password”类型,因为我们希望用户能够使用用户名和密码进行身份验证。
  3. 现在,我们需要修改 AuthServiceProvider 类中的 boot 方法,以使用 Passport 提供的 TokenGuard 来保护我们的应用程序路由。我们需要在此方法中添加以下代码:
代码语言:php复制
IlluminateSupportFacadesAuth::viaRequest('api', function ($request) {
    return LaravelPassportPassport::checkToken($request) ? auth()->user() : null;
});
  1. 接下来,我们需要创建一个路由来处理用户身份验证请求。可以使用 Laravel 自带的 AuthController 类来处理此请求。在此控制器中,我们需要使用 Passport 提供的 issueToken 方法来颁发访问令牌。以下是一个示例方法:
代码语言:php复制
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);
    }
}
  1. 现在,我们需要在其他应用程序中使用这个认证系统。假设我们有一个名为“App2”的应用程序,现在我们需要修改该应用程序的身份验证逻辑,以使用我们刚才创建的 Passport 客户端来进行身份验证。以下是一个示例方法:
代码语言:php复制
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 系统的搭建过程。当用户在一个应用程序中进行身份验证时,该系统将颁发一个访问令牌,并将其传递到其他应用程序中,使用户能够在这些应用程序中保持登录状态。

0 人点赞