首页 > 解决方案 > Laravel 临时 SSO 方法

问题描述

我们希望在我们的程序中实现类似 SSO 的方法,用户将在第三方程序中注册并在我们的程序中同步注册并验证来自第三方的登录/注销。由于我们无权访问第三方的身份验证。第三方程序是我们客户的程序,它希望使用我们程序的服务。

由于像miniorage这样的软件包不是免费的,我们需要努力做到这一点。

这是我所做的并将尝试完成:

已经完成的代码:

  1. 在我们的程序中安装 laravel/passport。
  2. 创建一个注册API,第三方客户端可以使用它在我们的程序中注册
  3. 使用护照,它将返回他们需要保存在系统中的不记名令牌(删除到期日期)
  4. 创建一个将接受在注册期间创建的不记名令牌的 URL
  5. 打开 URL 后,我将能够使用Auth::user()并获取用户信息。

试图完成:

$credentials = ([
    'email' => 'test@gmail.com',
]);

if (Auth::attempt($credentials)) {
    Log::info(Auth::user());
}
  1. 从 Auth::user() 获取电子邮件地址并使用上面的代码重新登录
  2. 但是,当我打开另一个页面时, Auth::user() 是空的。

我的问题是:

1 这种方法适用于临时 SSO 吗?

2 即使我手动登录用户,为什么 Auth::user() 在不同的 url 上为空?

更新

所以我想我会继续使用 Laravel Passport 作为我们项目的临时 SSO。但是,当我在标头中传递令牌时,我想做一个 Auth::login() :

这将是代码:

public function authenticate()
{
    $user = Auth::user();
    Log::info($user);
    . . . . . . 
    $authuser = User::where('email', '=', $user->email)->first();
    $authuser = Auth::login($authuser);
    Log::info($authuser);
    return $user;
}

我希望在这里使用 Auth::Login 的原因是用户在所有页面上都经过身份验证。不只是在第一页。当function authenticate我使用承载令牌访问程序时使用 。在该$authuser部分中,我想仅使用电子邮件重新登录用户。之所以只有电子邮件,是因为之前的逻辑。是的,我们已经考虑过这个。但是,当我使用 Auth::login($authuser); 时,它会返回Method Illuminate\Auth\RequestGuard::login does not exist错误消息。

您希望看到的可能数据:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
        'hash' => false,
    ],
],

api => driver最初是在 laravel 护照实施之前的 token

标签: single-sign-onlaravel-8laravel-passport

解决方案


这种方法适用于临时 SSO 吗?

它可能适用于 Passport,但它并不是真正的预期用途 (OAuth2)。我发现它比推出自定义解决方案更令人困惑:

我会考虑使用手动 JWT 身份验证解决方案(https://jwt-auth.readthedocs.io/en/develop/laravel-installation/

2 即使我手动登录用户,为什么 Auth::user() 在不同的 url 上为空?

很可能是因为路由/控制器方法缺少说明它是经过身份验证的身份验证中间件。


推荐阅读