Autor Zpráva
vasam
Profil
Zdravím,
řeším problém, jak načíst (např. obrázky) ze serveru, kde je použita HTTP autentikace přes .htaccess.
Konkrétně mám PHP script, který se odkazuje na obrázky, jenž jsou na zaheslované subdoméně. Nechci, aby uživatel musel zadávat to heslo ručně, ale aby se za něj přihlásilo samo PHP.

Předem díky za odpovědi.
Aesir
Profil
vasam:

Přes cURL by to jít mělo. V manuálu mrkněte na "CURLOPT_HTTPAUTH".
vasam
Profil
Ano, vypadá, že přes CURL by to jít mělo, ale bohužel jsem nenašel nikde žádný funkční příklad pro snadnější pochopení, jak se používá konrétně hodnota CURLOPT_HTTPAUTH.
Majkl578
Profil
nesla by autentifikace pomoci http://user:heslo@server.tld/file.ext ?
vasam
Profil
Majkl578
IE toto bohužel nepodporuje :-(
Majkl578
Profil
moment, ty to chces dat primo do stranky? to se asi nevyhnes vyzrazeni hesla... to pak muzes tu autentikaci rovnou zrusit
vasam
Profil
Majkl578
vím - je to jen dočasné řešení
Pro klienta dělám web, který je zatím pod autentikací .htaccess (logicky, aby tam nelez nikdo cizí, když to ještě není hotové). K webu dělám redakční systém, který se odkazuje na fotky, které jsou na hlavním webu pod zámkem .htaccess-u. Nechci, aby když si bude klient zkoušet ten RS (zda mu bude vyhovovat), aby na něj při načtení fotek vyběhlo 20 přihlášení na původní web.
Majkl578
Profil
vasam
neni to nahodou tak, ze pri prvnim prihlaseni se zapamatuje a dale uz neni opetovne zadani jmena a hesla pozadovano az do expirace? zda se mi ze ano
vasam
Profil
Majkl578
ano je, ale když je prvním spuštěním 20 fotek naráz, vyběhne 20 hlášek
Aesir
Profil
vasam:
ale bohužel jsem nenašel nikde žádný funkční příklad pro snadnější pochopení, jak se používá konrétně hodnota
Možná nějak takhle? Vycházím z běžného použití cURL, samozřejmě je to potřeba doplnit o další případné atributy, ošetření chyb apod.
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
curl_setopt($ch, CURLOPT_URL, "http://example.com/secure");
$response = curl_exec($ch);
vasam
Profil
Zjistil jsem, že je nutné provést CURL na každý obrázek, napadlo mě proto toto:
<?php

$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,"http://examle.com/foto/1_1.jpg");
curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);
curl_setopt($ch,CURLOPT_USERPWD,"user:pwd");
curl_exec($ch);
curl_close($ch);

header('Content-Type: image/jpeg');

?>

Bohužel to ale nefunguje, nevím z jakého důvodu...
Aesir
Profil
vasam:
Bohužel to ale nefunguje, nevím z jakého důvodu...
Jaká je odpověď serveru na tenhle požadavek (nejlépe kompletní hlavičky)? Nejspíš bude ten požadavek potřeba doplnit o nějaké parametry, zkuste třeba odchytit hlavičky úspěšného požadavku přes prohlížeč a ten pak přesně postavit přes curl.
vasam
Profil
Aesir
vrátí to (asi) zdrojový kód obrázku v "textové" podobě (něco ve smyslu: "˙Ř˙ŕ�JFIF������˙Ű�C�").
Bohužel nevím, jak zjistit vrácené hlavičky (ještě jsem to nepotřeboval) :-).

Napadlo mě (na základě "textového" načtení obrázku) ještě toto:
$ch=curl_init();
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_URL,"http://examle.com/foto/1_1.jpg");
curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);
curl_setopt($ch,CURLOPT_USERPWD,"user:pwd");
$obr=curl_exec($ch);
curl_close($ch);
header("Content-Type: image/jpeg");
imagejpeg($obr);

Toto již nevypíše pro změnu nic (kromě názvu domény, ze které se script spouští).
Aesir
Profil
vasam:
Zkuste ještě nastavit
curl_setopt($ch,CURLOPT_BINARYTRANSFER, 1);


Fce imagejpeg očekává trochu jiný vstup, takže takhle to nepůjde. Pokud dostanete zpět opravu čistý zdroják toho obrázku, tak by mělo stačit poslat správnou hlavičku a vypsat obsah do prohlížeče.
vasam
Profil
Aesir
Díky moc z radu - takto to již funguje korektně. Musel jsem ještě ale přidat příkazy k bufferování výstupu, kvůli funkčnosti hlavičky.
Výsledek tedy vypadá takto:
<?php

ob_start();

$ch=curl_init();
curl_setopt($ch,CURLOPT_BINARYTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_URL,"http://examle.com/foto/1_1.jpg");
curl_setopt($ch,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);
curl_setopt($ch,CURLOPT_USERPWD,"user:pwd");
$obr=curl_exec($ch);
curl_close($ch);
header("Content-Type: image/jpeg");
imagejpeg($obr);

ob_end_flush();

?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: