0

我在公司建立了很多内部应用程序。我的编程是在数据库/应用程序级别。我的大多数应用程序多年来一直使用相同的登录/身份验证类。但是,该公司希望一切都通过他们的 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 数据库中查找您并使用您相应的行进行权限/访问。那有意义吗?现在试着写那部分。

4

1 回答 1

0

在您的情况下,您的 MySQL 数据库中的用户和 SSO 服务器之间必须存在映射。一个简单的方法是电子邮件地址。更好的方法是 GUID - 全球唯一 ID。不管是什么,当 SSO 服务器调用您的 actionURL(在 SSO 术语中......您的回调 url)时,它应该传递一个唯一的 ID 来识别用户。

获得唯一 ID 后,使用该 ID 从 MySQL 数据库中检索用户。如果他存在,请登录他。

通常,SSO 服务器会创建一个您的应用程序可以看到的 cookie。这应该表明您的用户是否已登录(因此您不必继续返回服务器来验证用户身份)。

高温高压

于 2013-04-22T19:28:51.940 回答