我在公司建立了很多内部应用程序。我的编程是在数据库/应用程序级别。我的大多数应用程序多年来一直使用相同的登录/身份验证类。但是,该公司希望一切都通过他们的SSO身份验证应用程序。他们向我发送了他们的SSO应用程序URL,他们传递的字段名称,我的网站actionURL和我的appKey。
我的所有应用程序都位于同一个域中。我知道我可以设置cookie来处理整个域并拥有该集。现在我有点卡住,因为我写了一些非常简单的测试代码。它将用户带到SSO服务器并进行身份验证并将其发送回我的actionURL,这只是我的域名的根目录。
所以我试图请求我的代码背后的URL,它表明我需要进行身份验证,将我传递给SSO应用程序,然后我会被传递回我的actionURL。我的actionURL需要什么才能让我浏览我的应用程序。
当前代码:
session_start();
if ($_POST && isset($_POST['digest']))
{
$digest = $_POST["digest"];
// set the session variables ...
$_SESSION['username'] = $_POST["firstname"]." ".$_POST["lastname"];
$_SESSION['firstname'] = $_POST["firstname"];
$_SESSION['lastname'] = $_POST["lastname"];
$_SESSION['email'] = $_POST["email"];
$_SESSION['uid'] = $_POST["uid"];
// Needed for key
$uid = $_POST["uid"];
$time = $_POST["time"];
// Read the property file with the key and URL so this won't go into the main code ...
// this sets $appKey and $safeurl
require_once("safe_login_properties.php");
$mykey = "".$uid.$time.$appKey;
$mydigest = md5($mykey);
if ($debugthis) // enable this for some debugging
{
$fp = fopen("DebugInfo.txt", "a");
fprintf($fp, "%s\n", date("H:i:s"));
foreach($_POST as $p => $v)
{
fprintf($fp, "POST: %s: %s\n", $p, $v);
}
foreach($_SESSION as $p => $v)
{
fprintf($fp, "SESSION: %s: %s\n", $p, $v);
}
fprintf($fp, "mykey: %s (uid: %s, time %s, key %s)\n", $mykey, $uid, $time, $appKey);
fprintf($fp, "posted digest: %s\n", $digest);
fprintf($fp, "mydigest: %s\n", $mydigest);
if ($digest == $mydigest)
fprintf($fp, "Digest match\n");
else
fprintf($fp, "***** digest does not match\n");
fclose($fp);
}
if ($digest != $mydigest)
{
die("Invalid login - expected digest does not match");
}
}
if (!isset($_SESSION['username']) || empty($_SESSION['username']))
{
// Read the property file with the key and URL so this won't go into the main code ...
// this sets $appKey and $safeurl
require_once("safe_login.php");
header("Location: ".$safeurl);
}
其他信息 - 我的所有应用程序都是基于mysql和php的。所以我需要把我的mysql片段放进去。我需要的东西是肯定的,你是被授权的,你的用户名被传递了,现在我们将在mysql数据库中查找你并使用相应的行进行权限/访问。那有意义吗?试着立刻写下这部分。
答案 0 :(得分:0)
在您的情况下,MySQL数据库中的用户与SSO服务器之间必须存在映射。一个简单的就是一个电子邮件地址。一个更好的是GUID - 全球唯一ID。无论何时,SSO服务器都应该在它调用你的actionURL时传递一个识别用户的唯一ID(以SSO术语......你的回调网址)。
获得唯一ID后,使用该ID从MySQL DB中检索用户。如果他存在,请将他登录。
通常,SSO服务器将创建一个应用程序可以看到的cookie。这应该表明您的用户是否已登录(因此您不必继续返回服务器以对用户进行身份验证)。
HTH