前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 的优雅之处 之,Passport搭建SSO系统

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

原创
作者头像
Bolton
发布2023-06-13 12:31:33
1K0
发布2023-06-13 12:31:33
举报
文章被收录于专栏:php&laravel

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
复制
\Illuminate\Support\Facades\Auth::viaRequest('api', function ($request) {
    return \Laravel\Passport\Passport::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' => Carbon\Carbon::parse(
                $tokenResult->token->expires_at
            )->toDateTimeString()
        ]);
    } else {
        return response()->json(['error' => 'Unauthenticated'], 401);
    }
}
  1. 现在,我们需要在其他应用程序中使用这个认证系统。假设我们有一个名为“App2”的应用程序,现在我们需要修改该应用程序的身份验证逻辑,以使用我们刚才创建的 Passport 客户端来进行身份验证。以下是一个示例方法:
代码语言:php
复制
public function authenticate(Request $request)
{
    $http = new GuzzleHttp\Client;

    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 (GuzzleHttp\Exception\BadResponseException $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 系统的搭建过程。当用户在一个应用程序中进行身份验证时,该系统将颁发一个访问令牌,并将其传递到其他应用程序中,使用户能够在这些应用程序中保持登录状态。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档