example - php digest
Realización de una solicitud HTTP GET con autenticación HTTP-Basic (4)
¿De verdad quieres usar php para eso?
un simple script de javascript lo hace:
function login(username, password, url) {
var http = getHTTPObject();
http.open("get", url, false, username, password);
http.send("");
//alert ("HTTP status : "+http.status);
if (http.status == 200) {
//alert ("New window will be open");
window.open(url, "My access", "width=200,height=200", "width=300,height=400,scrollbars=yes");
//win.document.location = url;
} else {
alert("No access to the secured web site");
}
}
function getHTTPObject() {
var xmlhttp = false;
if (typeof XMLHttpRequest != ''undefined'') {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
} else {
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@end @*/
}
return xmlhttp;
}
Necesito crear un proxy para un proyecto de Flash Player en el que estoy trabajando. Simplemente necesito hacer una solicitud HTTP GET con autenticación HTTP-Basic a otra URL, y enviar la respuesta de PHP como si el archivo PHP fuera la fuente original. ¿Cómo puedo hacer esto?
Marc B hizo un gran trabajo respondiendo esta pregunta. Recientemente tomé su enfoque y quería compartir el código resultante.
<?PHP
$username = "some-username";
$password = "some-password";
$remote_url = ''http://www.somedomain.com/path/to/file'';
// Create a stream
$opts = array(
''http''=>array(
''method''=>"GET",
''header'' => "Authorization: Basic " . base64_encode("$username:$password")
)
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents($remote_url, false, $context);
print($file);
?>
Espero que esto sea de ayuda para las personas!
Tomé el código de @ clone45 y lo convertí en una serie de funciones algo así como la interfaz de requests de Python (suficiente para mis propósitos) sin usar solo un código externo. Tal vez pueda ayudar a alguien más.
Lo maneja:
- autenticación básica
- encabezados
- GET Params
Uso:
$url = ''http://sweet-api.com/api'';
$params = array(''skip'' => 0, ''top'' => 5000);
$header = array(''Content-Type'' => ''application/json'');
$header = addBasicAuth($header, getenv(''USER''), getenv(''PASS''));
$response = request("GET", $url, $header, $params);
print($response);
Definiciones
function addBasicAuth($header, $username, $password) {
$header[''Authorization''] = ''Basic ''.base64_encode("$username:$password");
return $header;
}
// method should be "GET", "PUT", etc..
function request($method, $url, $header, $params) {
$opts = array(
''http'' => array(
''method'' => $method,
),
);
// serialize the header if needed
if (!empty($header)) {
$header_str = '''';
foreach ($header as $key => $value) {
$header_str .= "$key: $value/r/n";
}
$header_str .= "/r/n";
$opts[''http''][''header''] = $header_str;
}
// serialize the params if there are any
if (!empty($params)) {
$params_array = array();
foreach ($params as $key => $value) {
$params_array[] = "$key=$value";
}
$url .= ''?''.implode(''&'', $params_array);
}
$context = stream_context_create($opts);
$data = file_get_contents($url, false, $context);
return $data;
}
Usar file_get_contents()
con una stream
para especificar las credenciales de HTTP, o usar curl
y la opción CURLOPT_USERPWD
.