Пример #1
0
 /**
  * Return a description how we can do a consumer allocation.  Prefers static allocation if
  * possible.  If static allocation is possible
  * 
  * See also: http://oauth.net/discovery/#consumer_identity_types
  * 
  * @param string uri
  * @return array		provider description
  */
 static function discover($uri)
 {
     // See what kind of consumer allocations are available
     $xrds_file = self::discoverXRDS($uri);
     if (!empty($xrds_file)) {
         $xrds = xrds_parse($xrds_file);
         if (empty($xrds)) {
             throw new OAuthException2('Could not discover OAuth information for ' . $uri);
         }
     } else {
         throw new OAuthException2('Could not discover XRDS file at ' . $uri);
     }
     // Fill an LingotekOAuthServer record for the uri found
     $ps = parse_url($uri);
     $host = isset($ps['host']) ? $ps['host'] : 'localhost';
     $server_uri = $ps['scheme'] . '://' . $host . '/';
     $p = array('user_id' => null, 'consumer_key' => '', 'consumer_secret' => '', 'signature_methods' => '', 'server_uri' => $server_uri, 'request_token_uri' => '', 'authorize_uri' => '', 'access_token_uri' => '');
     // Consumer identity (out of bounds or static)
     if (isset($xrds['consumer_identity'])) {
         // Try to find a static consumer allocation, we like those :)
         foreach ($xrds['consumer_identity'] as $ci) {
             if ($ci['method'] == 'static' && !empty($ci['consumer_key'])) {
                 $p['consumer_key'] = $ci['consumer_key'];
                 $p['consumer_secret'] = '';
             } else {
                 if ($ci['method'] == 'oob' && !empty($ci['uri'])) {
                     // TODO: Keep this uri somewhere for the user?
                     $p['consumer_oob_uri'] = $ci['uri'];
                 }
             }
         }
     }
     // The token uris
     if (isset($xrds['request'][0]['uri'])) {
         $p['request_token_uri'] = $xrds['request'][0]['uri'];
         if (!empty($xrds['request'][0]['signature_method'])) {
             $p['signature_methods'] = $xrds['request'][0]['signature_method'];
         }
     }
     if (isset($xrds['authorize'][0]['uri'])) {
         $p['authorize_uri'] = $xrds['authorize'][0]['uri'];
         if (!empty($xrds['authorize'][0]['signature_method'])) {
             $p['signature_methods'] = $xrds['authorize'][0]['signature_method'];
         }
     }
     if (isset($xrds['access'][0]['uri'])) {
         $p['access_token_uri'] = $xrds['access'][0]['uri'];
         if (!empty($xrds['access'][0]['signature_method'])) {
             $p['signature_methods'] = $xrds['access'][0]['signature_method'];
         }
     }
     return $p;
 }
Пример #2
0
/**
 * Perform discovery on a claimed ID to determine the OpenID provider endpoint.
 *
 * @param $claimed_id The OpenID URL to perform discovery on.
 *
 * @return Array of services discovered (including OpenID version, endpoint
 * URI, etc).
 */
function openid_discovery($claimed_id)
{
    $services = array();
    $xrds_url = $claimed_id;
    if (_openid_is_xri($claimed_id)) {
        $xrds_url = 'http://xri.net/' . $claimed_id;
    }
    $url = @parse_url($xrds_url);
    if ($url['scheme'] == 'http' || $url['scheme'] == 'https') {
        // For regular URLs, try Yadis resolution first, then HTML-based discovery
        $headers = array('Accept' => 'application/xrds+xml');
        //TODO
        $result = openid_http_request($xrds_url, $headers);
        if (!isset($result->error)) {
            if (isset($result->headers['Content-Type']) && preg_match("/application\\/xrds\\+xml/", $result->headers['Content-Type'])) {
                // Parse XML document to find URL
                $services = xrds_parse($result->data);
            } else {
                $xrds_url = NULL;
                if (isset($result->headers['X-XRDS-Location'])) {
                    $xrds_url = $result->headers['X-XRDS-Location'];
                } else {
                    // Look for meta http-equiv link in HTML head
                    $xrds_url = _openid_meta_httpequiv('X-XRDS-Location', $result->data);
                }
                if (!empty($xrds_url)) {
                    $headers = array('Accept' => 'application/xrds+xml');
                    //TODO
                    $xrds_result = openid_http_request($xrds_url, $headers);
                    if (!isset($xrds_result->error)) {
                        $services = xrds_parse($xrds_result->data);
                    }
                }
            }
            // Check for HTML delegation
            if (count($services) == 0) {
                // Look for 2.0 links
                $uri = _openid_link_href('openid2.provider', $result->data);
                $delegate = _openid_link_href('openid2.local_id', $result->data);
                $version = 2;
                // 1.0 links
                if (empty($uri)) {
                    $uri = _openid_link_href('openid.server', $result->data);
                    $delegate = _openid_link_href('openid.delegate', $result->data);
                    $version = 1;
                }
                if (!empty($uri)) {
                    $services[] = array('uri' => $uri, 'delegate' => $delegate, 'version' => $version);
                }
            }
        }
    }
    return $services;
}