我们想在我们的程序中实现一个类似SSO的方法,用户将在第三方程序中注册并同步在我们的中注册编写并验证第三方的登录/注销。因为我们无法获得第三方的认证。第三方程序是我们客户的程序,它想要使用我们程序的服务。
因为像miniorage这样的包不是免费的,所以我们需要用艰难的方式来实现。
这是我所做的,并将尝试完成:
已完成代码:
- 安装laravel/passport到我们的程序
- 创建一个注册API,第三方客户端可以使用该API在我们的程序中注册
- 对于护照,它将返回一个承载令牌,他们需要保存在他们的系统中(删除到期日期)
- 创建一个URL,该URL将接受注册期间创建的承载令牌
- 当URL被打开时,我将能够使用
Auth::user()
并获取用户信息。
尝试完成:
$credentials = ([
'email' => 'test@gmail.com',
]);
if (Auth::attempt($credentials)) {
Log::info(Auth::user());
}
- 从Auth::user()获取电子邮件地址并使用上面的代码重新登录
- 但是,当我打开另一个页面时,Auth::user()是空的。
我的问题是
1这个方法对于临时的SSO是可以的吗?
2为什么即使我手动登录用户,Auth::user()在不同的url上也是空的?
所以我想我会继续使用Laravel Passport作为我们项目的临时SSO。但是,当我在header中传递令牌时,我想执行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 IlluminateAuthRequestGuard::login does not exist
错误消息。
您希望看到的可能数据:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
],
api => driver
最初是令牌,在laravel护照实现之前
这种方法可以作为临时的SSO吗?
它可能与Passport一起工作,但它并不是它的真正预期用途(OAuth2)。我发现这比仅仅推出一个自定义解决方案更令人困惑:
-
Install JWT auth - https://jwt-auth.readthedocs.io/en/develop/laravel-installation/
-
在config/auth.php设置保护
我会考虑使用手动JWT验证解决方案(https://jwt-auth.readthedocs.io/en/develop/laravel-installation/)
2为什么Auth::user()在不同的url上为空,即使我手动登录用户?
很可能是因为路由/控制器方法缺少一个认证中间件,它说它是一个已认证的。
经过反复试验,我决定使用Laravel Passport并修复了Auth::login不持久。对于Auth::login问题,我将IlluminateSessionMiddlewareStartSession::class,
从$middlewareGroups
移动到$middleware