josso是一个sso开源软件
本文通过浅析一个php agent的文件和一个sample来描述josso如何工作.
josso版本 1.8.1
josso php agent的相关文件
nusoap
php的一个ws相关的开发包。
josso-cfg.inc
配置文件。配置josso的url等等.
class.jossorole.php
定义jossorole,只有name.
class.jossouser.php
定义jossouser,只有name和properties.
class.jossoagent.php
定义jossoagent,包含大量方法。
getNewInstance 用配置文件josso-cfg.inc里面的信息构造jossoagent.
jossoagent 构造函数。
getUserInSession //Gets the authnenticated jossouser, if any.
isUserInRole($rolename)
findRolesBySSOSessionId($sessionId)
accessSession //Sends a keep-alive notification to the SSO server so that SSO sesison is not lost.
isAutomaticLoginRequired
resolveAuthenticationAssertion
josso.php
分为两部分
1 php逻辑,检查是否是ignored resource, 基于josso-cfg.inc.
如果是josso partner app的话,是否需要自动login.
2 方法的定义
//这一组是用来login,和logout的
jossoRequestLogin() //用$_SERVER['REQUEST_URI']作为currentUrl去做login,Use this function when ever you want to start user authentication.
jossoRequestOptionalLogin()
jossoRequestLoginForUrl($currentUrl, $optional) //为currentUrl做login,完成后会跳到josso-security-check.php
jossoRequestLogout() //Use this function when ever you want to logout the current user.
jossoRequestLogoutForUrl($currentUrl)
//这一组是用来生成各种url的
jossoCreateAuthenticationUrl() //Creates a Authentication Url. 这个源文件里面的注释和变量名起的不好,容易误解。
jossoCreateLoginUrl() //Creates a login url for the current page, use to create links to JOSSO login page(josso-login.php).
jossoCreateLogoutUrl($backToUrl)
jossoSecurityCheckUrl
//辅助的
forceRedirect($url,$die=true)
createBaseUrl
createFrontChannelParams //Add some request parameters like host name
prepareNonCacheResponse
例子流程描述
1 index.php
//通过agent拿到user和sessionId
$user = $josso_agent->getUserInSession();
$sessionId = $josso_agent->getSessionId();
// Check if user is authenticated
if (isset($user)) {
//如果已经通过验证
//可以通过提供的多个方法得到该用户的用户信息,role信息等等.
// logout url.
echo 'Click <a href="'.jossoCreateLogoutUrl(NULL).'">here</a> to logout ...<br>';
} else {
// User is unknown. 提供一个loginUrl,该方法生成的url会附加当前的url
//生成的url类似于http://localhost/josso-php-partnerapp/josso-login.php?josso_current_url=/josso-php-partnerapp/index.php
echo 'Click <a href="'.jossoCreateLoginUrl().'">here</a> to login ...';
}
2 josso-login.php
//取出原有的url,保证做完login可以跳回该url
$currentUrl = $_REQUEST['josso_current_url'];
去做认证,这里不会直接跳回currentUrl,而是先跳回josso-security-check.php,当然currentUrl的信息会保留,从而从josso-security-check.php跳到currentUrl
这里最终会到一个类似于http://localhost:8080/josso/signon/login.do?josso_back_to=http://localhost/josso-php-partnerapp/josso-security-check.php&josso_partnerapp_host=localhost的
url去做用户认证.
jossoRequestLoginForUrl($currentUrl);
3 josso server的login.
4 josso-security-check.php
//返回josso-security-check是不带sessionid的,只有assertion_id,通过assertion_id可以得到sessionId,然后放置在cookie里
$assertionId = $_REQUEST['josso_assertion_id'];
$ssoSessionId = $josso_agent->resolveAuthenticationAssertion($assertionId);
setcookie("JOSSO_SESSIONID", $ssoSessionId, 0, "/"); // session cookie ...
$_COOKIE['JOSSO_SESSIONID'] = $ssoSessionId;
//跳回原来的url,这里就是/josso-php-partnerapp/index.php
$backToUrl = $_SESSION['JOSSO_ORIGINAL_URL'];
forceRedirect($backToUrl, true);
5 index.php
跳回到index.php了.由于已经登录了,所以可以显示用户相关信息,同时给出一个logout的url.
// logout url.
// 和login时大同小异,类似于http://localhost/josso-php-partnerapp/josso-logout.php?josso_current_url=http://localhost/josso-php-partnerapp/index.php
echo 'Click <a href="'.jossoCreateLogoutUrl(NULL).'">here</a> to logout ...<br>';
6 josso-logout.php
//实际去做logout,并且可以跳回本来的url,即index.php,这里和login不同,不用到josso-security-check.php去做check.
$currentUrl = $_REQUEST['josso_current_url'];
jossoRequestLogoutForUrl($currentUrl);
7 josso server的logout
8 index.php
又回到了1的状态.