开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情
一、什么是单点登录SSO(Single Sign-On)
SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。
二、单点登录解决了什么问题
解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录。
例如CSDN中的论坛应用,博客应用,下载应用模块。我们只要在CSDN中访问任何一个子应用后,再访问其他应用站点的时候就不需要在进行登录。
三、在公司里面也通过.NET,进行了SSO的开发。
在网上看过不少的SSO实现方法。总结在实际项目开发中的一些开发体会。
原理
根据你第三方登录页面输入的信息,判断是否用户正确信息,然后记录到cookie里面,然后带上加密的sign,跳转回去中间件文件callback.php,然后解密,进行当前项目的cookie进行赋值,然后跳转回首页,并且实现登录了!
怎么实现
要实现SSO单点登录,可以使用PHP编写一个认证中心(Authentication Center),来处理用户的登录请求和验证用户身份的过程。以下是一个基本的SSO单点登录流程,使用PHP来实现:
- 用户在应用程序A中尝试登录,但没有有效的身份验证凭据,因此被重定向到认证中心。
- 认证中心显示登录页面,并提示用户输入其凭据。
- 用户输入凭据并提交表单。
- 认证中心验证用户凭据的有效性,并在成功验证后生成一个加密的授权令牌(Authorization Token),该令牌包含有关用户身份的信息,并将该令牌存储在认证中心的会话中。
- 认证中心将授权令牌作为参数添加到重定向URL中,并将用户重定向回应用程序A。
- 应用程序A接收到重定向URL并将授权令牌发送给认证中心进行验证。
- 认证中心验证授权令牌的有效性,并返回用户身份信息给应用程序A,以便应用程序A可以使用该信息进行授权和用户会话管理。
下面是一个简单的PHP代码示例,用于实现上述SSO单点登录流程的认证中心:
phpCopy code
<?php
// 确定授权令牌的有效期
$expiration_time = time() + 3600; // 有效期为1小时
// 生成授权令牌并存储到session中
$auth_token = array(
'user_id' => $user_id,
'username' => $username,
'expiration_time' => $expiration_time
);
session_start();
$_SESSION['auth_token'] = $auth_token;
// 将授权令牌添加到重定向URL中
$redirect_url = 'http://app_a.com/login.php?auth_token=' . urlencode(json_encode($auth_token));
// 重定向回应用程序A
header('Location: ' . $redirect_url);
exit;
?>
在上面的示例中,我们生成了一个包含用户身份信息和有效期的授权令牌,并将其存储在PHP session中。然后将该令牌添加到重定向URL中,并使用PHP的header函数进行重定向。接下来,应用程序A可以使用该授权令牌进行验证,并使用该信息来管理用户会话。