PHP - 解释我的SSO身份验证所需的步骤

时间:2013-04-19 03:29:21

标签: php mysql single-sign-on

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

1 个答案:

答案 0 :(得分:0)

在您的情况下,MySQL数据库中的用户与SSO服务器之间必须存在映射。一个简单的就是一个电子邮件地址。一个更好的是GUID - 全球唯一ID。无论何时,SSO服务器都应该在它调用你的actionURL时传递一个识别用户的唯一ID(以SSO术语......你的回调网址)。

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

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

HTH