/** * 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; }
/** * 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; }