首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单点登录(sso)拉拉

单点登录(sso)拉拉
EN

Stack Overflow用户
提问于 2018-07-26 07:01:45
回答 2查看 13.1K关注 0票数 14

我有三个不同的拉拉网站,我想让用户登录在一个网站,然后他将自动登录到其他两个网站。例如:如果您在stackoverflow上登录,然后打开stackexchange,您将使用StackOverflow帐户登录。我尝试过许多包,但它们以无限的例外结束,或者根本无法工作。大多数基于SAML的软件包,我不知道为什么它不与我一起工作?我不知道我错过了什么?有任何配置这工作吗?,我正在使用拉拉5.6。所有的应用程序都在同一台服务器上。

我尝试过许多基于SAML、OpenID和共享会话的解决方案,但它们都没有与我一起工作。我不知道我是不是错过了什么。this is the last example,我试过了,但没有起作用

这是我的密码

站点A

代码语言:javascript
复制
$site_b = 'http://s_sesstion_2.test/';
Route::get('/', function (Request $request) use ($site_b) {
    $session_id = Session::getId();
    try {
        $http = new Client();
        $response = $http->post($site_b . 'api/sessions/server', [
            'form_params' => [
                'session_id' => $session_id,
            ],
            'headers' => [
                'Accept' => 'application/json',
            ]
        ]);
    } catch (Exception $e) {
        dd($e->getMessage());
    }
    return view('welcome');
});

B站点(路由/api.php)

代码语言:javascript
复制
    Route::post('/sessions/server', function (Request $request) {
    Storage::disk('local')->put('file.txt', $request->get('session_id'));
});

站点B( SITE /web.php)

代码语言:javascript
复制
    Route::get('/', function () {
    $session_id = Storage::disk('local')->get('file.txt');
    Session::setId($session_id);
    Session::start();
    //return Session::getId();// will return the same session id
    return \auth()->user();//this should return the auth user but it did not!!
});

我想要的只是在站点A注册,然后打开站点B,我将在其中注册。我会接受任何解决方案达到这个目的

EN

回答 2

Stack Overflow用户

发布于 2018-08-05 03:20:06

我实现了一个不使用SAML的SSO解决方案。我会在这里分享我的解决方案,希望能有所帮助。

单点登录

一个应用程序作为auth.domain的主身份验证服务器运行。其他应用程序运行在不同的域app1.domainapp2.domain,.

每个用户都链接到SSO令牌。这些令牌的过期时间非常短。所有身份验证过程(登录、重置密码、注册、.)在应用程序中只发生

当用户访问任何应用程序时,例如,app-1.domain

  1. 将用户重定向到auth.domain/login
  2. 如果用户以前登录过我们的系统,请在步骤6继续。
  3. 在表单中显示符号,等待有效的输入。
  4. 生成新的SSO令牌,过期时间小于3分钟。
  5. auth.domain“记住我的cookie”附加到响应中。
  6. 将重定向响应返回到app-1.domain/sso/{sso_token}
  7. app-1.domain应用程序读取数据库。如果SSO令牌有效且未过期,则查找与该令牌关联的用户。
  8. app-1.domain使用Auth::login($user)方法对上一步中找到的用户进行身份验证。
  9. app-1.domain从数据库清除接收到的SSO令牌

在这一步之后,用户将被认证为app-1.domain

会话共享

所有共享会话变量都应保存到数据库中。我实现了一个新的会话驱动程序:

  • 保留共享会话变量名的列表
  • 当读取/写入会话时,请检查会话变量的名称。如果该名称是前一个列表,则从数据库中读取/写入该值。否则,使用每个应用程序的私有会话。
票数 22
EN

Stack Overflow用户

发布于 2018-08-05 03:43:36

如果两个应用程序共享相同的数据库,则可以遵循以下方法:

在您的数据库中,创建一个默认会话id,该id最初将标记为false。

->现在只要用户登录到任何一个站点,就会生成一个新的哈希,并将其替换为默认值。

可选

->您还可以将哈希保存在浏览器本地存储中,以哈希作为键,以null作为值。

->现在当用户登录/切换到任何一个站点时,如果哈希匹配默认值,检查散列->,显示登录页面,否则显示配置文件页。

我的答案只有在您使用公共数据库登录时才有效,否则需要映射。

或者,您可以使用cookie来存储散列,并可以在跨域访问它们。可以在Cross-Domain Cookies找到@ludovic的例子

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51532814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档