Á¦18Àå Zend_InfoCard

¸ñÂ÷

18.1. µµÀÔ
18.1.1. ±âº»ÀûÀÎ »ç¿ë¹ý
18.1.2. Zend_Auth ÀÇ ºÎǰÀ¸·Î¼­ÀÇ »ç¿ë¹ý
18.1.3. Zend_InfoCard ÄÄÆÛ³ÍÆ® ´Üü·ÎÀÇ »ç¿ë¹ý
18.1.4. Claims ¿ÀºêÁ§Æ®ÀÇ »ç¿ë¹ý
18.1.5. ±âÁ¸ÀÇ ¾îÄ«¿îÆ®¿¡ÀÇ Á¤º¸ Ä«µåÀÇ Ã·ºÎ
18.1.6. Zend_InfoCard ¾î´ðÅÍÀÇ ÀÛ¼º

18.1. µµÀÔ

Zend_InfoCard ÄÄÆÛ³ÍÆ®´Â, Á¤º¸ Ä«µå (Information Cards) ÀÇ relying-party ¼­Æ÷Æ®¸¦ ½ÇÀåÇÑ °ÍÀÔ´Ï´Ù. Á¤º¸ Ä«µå´Â, ÀÎÅͳݻ󿡼­ÀÇ À¯Àú ½Äº° Á¤º¸ÀÇ °ü¸®³ª À¥ »çÀÌÆ®ÀÇ À¯Àú ÀÎÁõ (relying party (À¸)·ÎºÎÅÍ ÄÝ µË´Ï´Ù) µî¿¡ ÀÌ¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.

Á¤º¸ Ä«µå·Î ´ëÇØ¼­, ȤÀº ÀÎÅͳݻóÀÇ ½Äº° ¸ÞŸ½Ã½ºÅÛ¿¡ À־ÀÇ Á¤º¸ Ä«µåÀÇ Á߿伺¿¡ ´ëÇØ¼­´Â, IdentityBlog (À»)¸¦ ÂüÁ¶ÇØ ÁֽʽÿÀ.

18.1.1. ±âº»ÀûÀÎ »ç¿ë¹ý

Zend_InfoCard ÀÇ »ç¿ë¹ýÀº, Zend_Auth ÄÄÆÛ³ÍÆ®ÀÇ ÀϺημ­ Zend_InfoCard ÀÎÁõ ¾î´ðÅ͸¦ »ç¿ëÇÏ´ÂÁö, ȤÀº ´ÜüÀÇ ÄÄÆÛ³ÍÆ®·Î¼­ »ç¿ëÇÒ±îÀÇ ¸ÓÁö¾Ê¾ÆÀΰ¡ÀÔ´Ï´Ù. ¾î´À ÂÊÀÇ °æ¿ì¿¡ ´ëÇØ¼­µµ, À¯Àú·ÎºÎÅÍ Á¤º¸ Ä«µå¸¦ ¹ÞÀ¸·Á¸é HTML ÀÇ ·Î±×ÀÎ Æû Áß(¾È)¿¡¼­ ´ÙÀ½°ú °°Àº HTML ºí·ÏÀ» »ç¿ëÇÕ´Ï´Ù.


<form action="http://example.com/server" method="POST">
  <input type='image' src='/images/ic.png' align='center' 
        width='120px' style='cursor:pointer' />
  <object type="application/x-informationCard" 
          name="xmlToken">
   <param name="tokenType" 
         value="urn:oasis:names:tc:SAML:1.0:assertion" />
   <param name="requiredClaims" 
         value="http://.../claims/privatepersonalidentifier 
         http://.../claims/givenname 
         http://.../claims/surname" />
 </object>
</form>

ÀÌ ¿¹¿¡ ´ëÇϰí,requiredClaims <param> ű׷Π³ªÅ¸³»°í ÀÖ´Â °ÍÀÌ, claim (»ç¶÷ÀÇ ¼º¸í µî) (À¸)·Î ºÒ¸®´Â ½Äº° Á¤º¸ÀÔ´Ï´Ù. À̰ÍÀº, À¥ »çÀÌÆ® ("relying party") ÇÏÁö¸¸ Á¤º¸ Ä«µå¿¡ ÀÇÇÑ ÀÎÁõÀ» ½Ç½ÃÇϱâ À§Çؼ­ ÇÊ¿äÇÕ´Ï´Ù.

À§ÀÇ HTML (À»)¸¦ À¯Àú°¡ ½ÇÇàÇÑ´Ù (Ŭ¸¯ÇÑ´Ù) ¶ó°í ºê¶ó¿ìÀú´Â Ä«µå ¼±Åà ÇÁ·Î±×·¥À» ½ÇÇàÇÕ´Ï´Ù. À̰ÍÀº, ±× »çÀÌÆ®ÀÇ ¿ä±¸¸¦ ä¿ì´Â Á¤º¸ Ä«µå¸¦ Ç¥½Ã½Ãų »Ó¸¸ ¾Æ´Ï¶ó, Á¶°ÇÀ» ä¿ì´Â Á¤º¸ Ä«µå°¡ º¹¼ö Á¸ÀçÇÏ´Â °æ¿ì¿¡ ÁÁ¾ÆÇÏ´Â °ÍÀ» ¼±ÅýÃų ¼ö ÀÖ½À´Ï´Ù. ÀÌ Á¤º¸ Ä«µå´Â, ÁöÁ¤Çß´Ù URL ¿¡ XML ¹®¼­·Î¼­ POST µÇ¾î À̰ÍÀ» Zend_InfoCard ÄÄÆÛ³ÍÆ®·Î ó¸®ÇÏ°Ô µË´Ï´Ù.

Á¤º¸ Ä«µå´Â,SSL ±×¸®°í ¾ÏȣȭÇß´Ù URL ¿¡ÀÇ HTTP POST ¹Û¿¡ ÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇսôÙ. SSL ¿¡ ÀÇÇÑ ¾Ïȣȭ¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­´Â, À¥ ¼­¹öÀÇ ¹®¼­¸¦ ÂüÁ¶ÇØ ÁֽʽÿÀ.

18.1.2. Zend_Auth ÀÇ ºÎǰÀ¸·Î¼­ÀÇ »ç¿ë¹ý

ÀÌ ÄÄÆÛ³ÍÆ®¸¦ Zend_Auth ÀÎÁõ ½Ã½ºÅÛ°ú Á¶ÇÕÇØ »ç¿ëÇÏ·Á¸é , Zend_Auth_Adapter_InfoCard (À»)¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù (À̰ÍÀº, ´Üü·Î ¹èÆ÷µÇ°í ÀÖ´Ù Zend_InfoCard ¿¡´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù). ÀÌ ¼ö¹ýÀ¸·ÎÀÇ »ç¿ë¿¹¸¦ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.


<?php
require_once 'Zend/InfoCard/Auth/Adapter.php';
require_once 
'Zend/Auth.php';

if (isset(
$_POST['xmlToken'])) {

    
$adapter = new Zend_Auth_Adapter_InfoCard($_POST['xmlToken']);
    
    
$adapter->addCertificatePair('/usr/local/Zend/apache2/conf/server.key',
                                 
'/usr/local/Zend/apache2/conf/server.crt');
    
    
    
$auth Zend_Auth::getInstance();
    
    
$result $auth->authenticate($adapter);
    
    switch (
$result->getCode()) {
        case 
Zend_Auth_Result::SUCCESS:
            
$claims $result->getIdentity();
            print 
"Given Name: {$claims->givenname}<br />";
            print 
"Surname: {$claims->surname}<br />";
            print 
"Email Address: {$claims->emailaddress}<br />";
            print 
"PPI: {$claims->getCardID()}<br />";
            break;
        case 
Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
            print 
"The Credential you provided did not pass validation";
            break;
        default:
        case 
Zend_Auth_Result::FAILURE:
            print 
"There was an error processing your credentials.";
            break;
    }
    
    if (
count($result->getMessages()) > 0) {
        print 
"<pre>";
        
var_dump($result->getMessages());
        print 
"</pre>";
    }
    
    
}

?>
<hr />
<div id="login" style="font-family: arial; font-size: 2em;">
<p>Simple Login Demo</p>
   <form method="post">
      <input type="submit" value="Login" />
      <object type="application/x-informationCard" name="xmlToken">
          <param name="tokenType" value="urn:oasis:names:tc:SAML:1.0:assertion" />
          <param name="requiredClaims" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" />
      </object>
    </form>
</div>

À§ÀÇ ¿¹¿¡¼­´Â, ¿ì¼± ÃÖÃÊ·Î Zend_Auth_Adapter_InfoCard ÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇϰí, Ä«µå ½Ç·ºÅͷκÎÅÍ ¼Û½ÅµÇ¾ú´Ù XML µ¥ÀÌÅ͸¦ °Å±â¿¡ °Ç³×ÁÖ°í ÀÖ½À´Ï´Ù. ÀνºÅϽº¸¦ ÀÛ¼ºÇϸé, ´ÙÀ½¿¡ SSL Áõ¸í¼­ÀÇ ºñ¹Ð¿­¼è/°ø°³¿­¼è Æä¾î¸¦ ÁöÁ¤ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÌ Æä¾î´Â,HTTP POST (À»)¸¦ ¹ÞÀº À¥ ¼­¹ö·Î »ç¿ëÇϰí ÀÖ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÆÄÀÏÀ» »ç¿ëÇϰí, ¼­¹ö¿¡ ¼Û½ÅµÈ Á¤º¸ÀÇ Ç༱ÁöÀÇ °ËÁõÀ» ½Ç½ÃÇÕ´Ï´Ù. Á¤º¸ Ä«µå¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â À̰͵éÀÌ ÇÊ¿äÇÕ´Ï´Ù.

¾î´ðÅÍÀÇ ¼³Á¤ÀÌ »ì¸é, ³ª¸ÓÁö´Â Zend_Auth ÀÇ Ç¥ÁØ ±â´ÉÀ» »ç¿ëÇØ Á¤º¸ Ä«µå ÅäÅ«ÀÇ °ËÁõÀ» ½Ç½ÃÇØ, getIdentity() ±×¸®°í ÃëµæÇÑ ½Äº° Á¤º¸¸¦ ±âÃÊ·Î À¯ÀúÀÇ ÀÎÁõÀ» ½Ç½ÃÇÕ´Ï´Ù.

18.1.3. Zend_InfoCard ÄÄÆÛ³ÍÆ® ´Üü·ÎÀÇ »ç¿ë¹ý

Zend_InfoCard ÄÄÆÛ³ÍÆ®¸¦, ±×°Í ´Üü·Î »ç¿ëÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù.±× °æ¿ì´Â Zend_InfoCard Ŭ·¡½º¸¦ Á÷Á¢ Á¶ÀÛÇÕ´Ï´Ù. Zend_InfoCard Ŭ·¡½ºÀÇ »ç¿ë¹ýÀº,Zend_Auth ÄÄÆÛ³ÍÆ®¿Í Á¶ÇÕÇØ »ç¿ëÇÏ´Â °æ¿ì¿Í °ÅÀÇ °°½À´Ï´Ù. ÀÌÇÏ¿¡ »ç¿ë¿¹¸¦ ³ªÅ¸³À´Ï´Ù.


<?php
require_once 'Zend/InfoCard.php';

if (isset(
$_POST['xmlToken'])) {
    
$infocard = new Zend_InfoCard();
    
$infocard->addCertificatePair('/usr/local/Zend/apache2/conf/server.key',
                                   
'/usr/local/Zend/apache2/conf/server.crt');

    
$claims $infocard->process($_POST['xmlToken']);
    
    if(
$claims->isValid()) {
        print 
"Given Name: {$claims->givenname}<br />";
        print 
"Surname: {$claims->surname}<br />";
        print 
"Email Address: {$claims->emailaddress}<br />";
        print 
"PPI: {$claims->getCardID()}<br />";
    } else {
        print 
"Error Validating identity: {$claims->getErrorMsg()}";
    }
}

?>
<hr />
<div id="login" style="font-family: arial; font-size: 2em;">
<p>Simple Login Demo</p>
   <form method="post">
      <input type="submit" value="Login" />
      <object type="application/x-informationCard" name="xmlToken">
          <param name="tokenType" value="urn:oasis:names:tc:SAML:1.0:assertion" />
          <param name="requiredClaims" value="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" />
      </object>
    </form>
</div>

À§ÀÇ ¿¹¿¡¼­´Â,Zend_InfoCard ÄÄÆÛ³ÍÆ®¸¦ ´Üü·Î »ç¿ëÇϰí, À¯Àú°¡ ¼Û½ÅÇÑ ÅäÅ«À» °ËÁõÇϰí ÀÖ½À´Ï´Ù. Zend_Auth_Adapter_InfoCard ÀÇ °æ¿ì¿Í °°ÀÌ, Zend_InfoCard ÀÇ ÀνºÅϽº¸¦ ÀÛ¼ºÇÏ°í ³ª¼­ À¥ ¼­¹öÀÇ SSL Áõ¸í¼­ÀÇ °ø°³ Ű/ºñ¹Ð Ű Æä¾î¸¦ ¼³Á¤ÇÕ´Ï´Ù. ¼³Á¤ÀÌ »ì¸é,process() ¸Þ¼Òµå·Î Á¤º¸ Ä«µåÀÇ Ã³¸®¸¦ ½Ç½ÃÇØ ±× °á°ú¸¦ µ¹·ÁÁÝ´Ï´Ù.

18.1.4. Claims ¿ÀºêÁ§Æ®ÀÇ »ç¿ë¹ý

Zend_InfoCard ÀÇ »ç¿ë ¹æ¹ý (´Üü·Î »ç¿ëÇϵ簡, ȤÀº Zend_Auth ÀÇ ÀϺημ­ Zend_Auth_Adapter_InfoCard °æÀ¯·Î »ç¿ëÇÒ±î) ¿¡ °ü°è¾øÀÌ, Á¤º¸ Ä«µå¸¦ ó¸®ÇÑ °á°ú´Â Zend_InfoCard_Claims ¿ÀºêÁ§Æ®·Î¼­ µ¹·ÁÁÖ¾îÁý´Ï´Ù. ÀÌ ¿ÀºêÁ§Æ®¿¡´Â assertions (claims) ÇÏÁö¸¸ Æ÷ÇԵ˴ϴÙ. À̰ÍÀº, À¯Àú ÀÎÁõ ½Ã¿¡ ´ç½ÅÀÇ »çÀÌÆ®°¡ ³½ ¿ä±¸¿¡ ÀǰÅÇϰí, À¯Àú°¡ ¼Û½ÅÇÑ µ¥ÀÌÅͷκÎÅÍ ÀÛ¼ºÇÑ °ÍÀÔ´Ï´Ù. À§ÀÇ ¿¹·Î ³ªÅ¸³» º¸ÀÎ °Íó·³, Á¤º¸ Ä«µåÀÇ Å¸´ç¼ºÀ» È®ÀÎÇÏ·Á¸é Zend_InfoCard_Claims::isVaild() ¸Þ¼Òµå¸¦ ÄÝ ÇÕ´Ï´Ù.claims ±×°ÍÀ» ÃëµæÇÏ·Á¸é , ´Ü¼øÇÏ°Ô ½Äº°ÀÚ (givenname µî) (À»)¸¦ ¿ÀºêÁ§Æ®ÀÇ ÇÁ·ÓÆÛƼ·Î¼­ ÁöÁ¤ÇØ ¾×¼¼½º ÇÏ´ÂÁö, ȤÀº getClaim() ¸Þ¼Òµå¸¦ »ç¿ëÇÕ´Ï´Ù.

´ëºÎºÐÀÇ °æ¿ì¿¡ ´ëÇØ getClaim() ¸Þ¼Òµå¸¦ »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ±×·¯³ª, ¸¸¾à requiredClaims ÇÏÁö¸¸ º¹¼öÀÇ ´Ù¸¥ ¼Ò½º/À̸§ °ø°£À¸·ÎºÎÅÍÀÇ Á¤º¸¸¦ ¿ä±¸Çϰí ÀÖ´Â °æ¿ì´Â, ±×°ÍÀ» ÀÌ ¸Þ¼Òµå·Î ¸í½ÃÀûÀ¸·Î ²¨³¾ Çʿ䰡 ÀÖ½À´Ï´Ù (claim ÀÇ ¿ÏÀüÇÑ URI (À»)¸¦ ³ª, Á¤º¸ Ä«µåÁß¿¡¼­ ±× °ªÀ» ÃëµæÇÕ´Ï´Ù). ÀϹݷÐÀ¸·Î¼­Zend_InfoCard ÄÄÆÛ³ÍÆ®°¡ µðÆúÆ®·Î ¼³Á¤ÇÑ´Ù claim ¿ë URI (Àº)´Â Á¤º¸ Ä«µå Áß(¾È)¿¡¼­ °¡Àå Àß ÀÌ¿ëµÇ´Â °ÍÀÔ´Ï´Ù. ÀÌ °æ¿ì´Â ´Ü¼øÇÏ°Ô ÇÁ·ÓÆÛƼ¸¦ »ç¿ëÇØ ¾×¼¼½º ÇÒ ¼ö ÀÖ½À´Ï´Ù.

°ËÁõ ó¸® Áß(¾È)¿¡¼­ °³¹ßÀÚ°¡ ½Ç½ÃÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â ºÎºÐÀº, Á¤º¸ Ä«µå³»ÀÇ claim ÀÇ ¹ßÇà¿øÀ» Á¶»çÇØ ±×°ÍÀ» ½Å·ÚÇÒ ¼ö ÀÖ´Â Á¤º¸¿øÀÎÁö ¾î¶²Áö¸¦ ÆÇÁ¤ÇÏ´Â °÷(Áß)ÀÔ´Ï´Ù. À̰ÍÀ» ½Ç½ÃÇϱâ À§Çؼ­,Zend_InfoCard_Claims ¿ÀºêÁ§Æ®¿¡´Â getIssuer() ¸Þ¼Òµå°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â, Á¤º¸ Ä«µåÀÇ claim ÀÇ ¹ßÇà¿ø URI (À»)¸¦ µ¹·ÁÁÝ´Ï´Ù.

18.1.5. ±âÁ¸ÀÇ ¾îÄ«¿îÆ®¿¡ÀÇ Á¤º¸ Ä«µåÀÇ Ã·ºÎ

±âÁ¸ÀÇ ÀÎÁõ ½Ã½ºÅÛ¿¡ Á¤º¸ Ä«µåÀÇ ¼­Æ÷Æ®¸¦ Ãß°¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯±â À§Çؼ­´Â,private personal identifier (PPI) (À»)¸¦ ¿¾³¯ºÎÅÍÀÇ ÀÎÁõ ¾îÄ«¿îÆ®¿¡ ¹¯¾î, ÃÖÀúÇÑÀÇ claim ÀÌ´Ù http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier (À»)¸¦ ¸®Äù½ºÆ®ÀÇ requiredClaims (À¸)·Î ÁöÁ¤ÇÕ´Ï´Ù.ÀÌ claim ÇÏÁö¸¸ ¿ä±¸µÇ¸é, Zend_InfoCard_Claims ¿ÀºêÁ§Æ®´Â ±× Ä«µå¿ëÀÇ ÀÏÀÇÀÎ ½Äº°ÀÚ¸¦ ÁغñÇÕ´Ï´Ù. À̰ÍÀº,getCardID() ¸Þ¼Òµå¿¡ ÀÇÇØ¼­ ½Ç½ÃÇÕ´Ï´Ù.

Á¤º¸ Ä«µå¸¦ ±âÁ¸ÀÇ ¿¾³¯ºÎÅÍÀÇ ÀÎÁõ ¾îÄ«¿îÆ®¿¡ ÷ºÎÇÏ´Â ¿¹¸¦, ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.


<?php
// ... 
public function submitinfocardAction() 
{
    if (!isset(
$_REQUEST['xmlToken'])) {
        throw new 
ZBlog_Exception("Expected an encrypted token but was not provided");
    }
    
    
$infoCard = new Zend_InfoCard();
    
$infoCard->addCertificatePair(SSL_CERTIFICATE_PRIVATESSL_CERTIFICATE_PUB);
    
    try {
        
$claims $infoCard->process($request['xmlToken']);
    } catch(
Zend_InfoCard_Exception $e) {
        
// TODO Error processing your request
        
throw $e;
    }
    
    if (
$claims->isValid()) {
        
$db ZBlog_Data::getAdapter();

        
$ppi $db->quote($claims->getCardID());
        
$fullname $db->quote("{$claims->givenname} {$claims->surname}");
        
        
$query "UPDATE blogusers SET ppi = $ppi, real_name = $fullname WHERE username='administrator'";
        
        try {
            
$db->query($query);
        } catch(
Exception $e) {
            
// TODO Failed to store in DB
        
}
        
        
$this->view->render();
        return;
    } else {
        throw new 
ZBlog_Exception("Infomation card failed security checks");
    }
}
?>

18.1.6. Zend_InfoCard ¾î´ðÅÍÀÇ ÀÛ¼º

Zend_InfoCard ÄÄÆÛ³ÍÆ®´Â, Á¤º¸ Ä«µåÀÇ Ç¥ÁØ ±Ô°ÝÀÇ º¯È­¿¡ ´ëÀÀÇϱâ À§Çؼ­ ¸ðµâ·¯ ±¸Á¶¸¦ ä¿ëÇϰí ÀÖ½À´Ï´Ù. Çö½ÃÁ¡¿¡¼­´Â, È®Àå Æ÷ÀÎÆ®ÀÇ »ó´ç¼ö´Â ¹Ì»ç¿ëÀ̹ǷΠ¹«½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, Á¤º¸ Ä«µåÀÇ ½ÇÀå¿¡ ´ëÇØ Çϳª¸¸ ½ÇÀåÇØ¾ß ÇÒ Á¡ÀÌ ÀÖ½À´Ï´Ù. ±×°ÍÀÌ Zend_InfoCard_Adapter ÀÔ´Ï´Ù.

Zend_InfoCard ¾î´ðÅÍ´Â, ÄÄÆÛ³ÍÆ®³»¿¡¼­ ÄݹéÀ» »ç¿ëÇØ ´Ù¾çÇÑ Ã³¸®¸¦ ½Ç½ÃÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ÄÄÆÛ³ÍÆ®°¡ Á¤º¸ Ä«µå¸¦ ó¸®ÇÒ ¶§ÀÇ Assertion ID ÀÇ º¸Á¸À̳ª ÃëµæµîÀ» ½Ç½ÃÇÕ´Ï´Ù. ¹ÞÀº Á¤º¸ Ä«µåÀÇ assertion ID ÀÇ º¸Á¸Àº Çʼö°¡ ¾Æ´Õ´Ï´Ù¸¸, ¸¸¾à °Å±â¿¡ ½ÇÆÐÇϸé, ¸®Ç÷¹ÀÌ °ø°Ý¿¡ ÀÇÇØ¼­ ÀÎÁõÀ» ½Å·ÚÇÒ ¼ö ¾ø´Â °ÍÀÌ µÉ °¡´É¼ºÀÌ ¹ß»ýÇÕ´Ï´Ù.

À̰ÍÀ» ÇÇÇϱâ À§Çؼ­´Â, Zend_InfoCard_Adapter_Interface (À»)¸¦ ½ÇÀåÇØ ±× ÀνºÅϽº¸¦ ¼³Á¤ÇÏ°í ³ª¼­ process() ¸Þ¼Òµå (´Üü) ȤÀº authenticate() ¸Þ¼Òµå (Zend_Auth ¾î´ðÅÍ) (À»)¸¦ ÄÝ ÇÏÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ¼³Á¤Çϱâ À§ÇÑ ¸Þ¼Òµå°¡ setAdapter() ÀÔ´Ï´Ù. ÀÌÇÏÀÇ ¿¹¿¡¼­´Â,Zend_InfoCard ¾î´ðÅ͸¦ ¼³Á¤ÇØ ¾îÇø®ÄÉÀ̼dz»¿¡¼­ »ç¿ëÇϰí ÀÖ½À´Ï´Ù.


<?php
class myAdapter implements Zend_InfoCard_Adapter_Interface 
{
    public function 
storeAssertion($assertionURI$assertionID$conditions
    {
        
/* Store the assertion and its conditions by ID and URI */
    
}
    
    public function 
retrieveAssertion($assertionURI$assertionID
    {
        
/* Retrieve the assertion by URI and ID */
    
}
    
    public function 
removeAssertion($assertionURI$assertionID
    {
        
/* Delete a given assertion by URI/ID */
    
}
}

$adapter  = new myAdapter();

$infoCard = new Zend_InfoCard();
$infoCard->addCertificatePair(SSL_PRIVATESSL_PUB);
$infoCard->setAdapter($adapter);

$claims $infoCard->process($_POST['xmlToken']);
?>