什么是单点登录,如何实现,结合示例讲解

单点登录Single Sign-On, SSO)是一种认证机制,允许用户只需登录一次,就可以访问多个相互独立的应用系统,而无需每次重新登录。它通过在多个系统之间共享认证状态,简化用户体验,提高安全性和效率。

实现步骤:

  1. 认证中心:搭建一个统一的认证服务器,所有应用系统都依赖它进行认证。
  2. 用户登录:用户在认证中心登录,生成凭证(如Token或Session)。
  3. 凭证共享:通过Cookie、Token或OAuth等方式,在不同应用系统中验证凭证的合法性。
  4. 自动登录:用户访问其他系统时,通过凭证自动认证,无需再次登录。

常见技术:

  • OAuth 2.0SAMLJWT 是常用的SSO实现协议或方式。

在实现单点登录SSO)时,前端的工作主要涉及以下几点:

1. 检测登录状态

前端需要通过向SSO服务器发送请求来判断当前用户是否已登录:

  • 使用 CookieToken(如JWT)从浏览器中获取凭证。
  • 向SSO服务器验证用户凭证的有效性。

2. 重定向至登录页面

如果用户未登录,前端会将用户重定向到SSO登录页面。

if (!isLoggedIn()) {
  window.location.href = 'https://sso.example.com/login?redirect=' + window.location.href;
}

redirect 参数确保用户登录后能返回原始页面。
注意:除了返回url还需要传递其他参数,比如appId这些跟服务方约定的参数,以便认证系统完成验证,这个需要根据项目的实际情况来定。

3. 接收登录信息

用户在SSO服务器登录后,前端会接收到用户凭证(如Token),并将其存储到浏览器中,以便后续请求携带。

localStorage.setItem('token', receivedToken);

4. 跨域请求

由于SSO可能涉及多个域名,前端需要处理跨域请求:

  • 设置 CORS 或使用隐藏的 iframe 来完成跨域认证。
  • 确保SSO服务器允许这些跨域请求。

5. 登出逻辑

前端提供一个统一的登出按钮,点击后通知SSO服务器销毁登录状态,然后从各个子系统清除用户数据。

function logout() {
  localStorage.removeItem('token');
  window.location.href = 'https://sso.example.com/logout';
}

示例实现流程:

<!DOCTYPE html>
<html>
<head>
  <title>SSO Demo</title>
</head>
<body>
  <h1>Single Sign-On Demo</h1>
  <button id="login-btn">Login</button>
  <button id="logout-btn">Logout</button>

  <script>
    function isLoggedIn() {
      return !!localStorage.getItem('token');
    }

    document.getElementById('login-btn').addEventListener('click', function() {
      if (!isLoggedIn()) {
        window.location.href = 'https://sso.example.com/login?redirect=' + window.location.href;
      }
    });

    document.getElementById('logout-btn').addEventListener('click', function() {
      localStorage.removeItem('token');
      window.location.href = 'https://sso.example.com/logout';
    });

    // On page load, check login status and act accordingly
    if (isLoggedIn()) {
      console.log('User is logged in');
      // Make authenticated requests
    } else {
      console.log('User is not logged in');
    }
  </script>
</body>
</html>

注意点:

  • 确保SSO服务器支持跨域策略。
  • 使用安全的存储方式(如HTTP-only Cookies)避免Token泄露。
  • 使用HTTPS确保数据传输安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端李易安

打赏1元鼓励作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值