浅析josso的php agent

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的状态.



你可能感兴趣的:(PHP,工作,Security,SSO)