REST API přihlašování – přístupo k http hlavičce Authorization

bluray
Člen | 178
+
0
-

Ahoj, potřeboval bych poradit s přihlašováním v REST API. Představa je taková, že klient pošle přihlašovací údaje v hlavičce Authorization, server ověří a zpět v této hlavičce vrátí token. Problém je, že se mi nedaří získat hodnotu této hlavičky (ostatní fungují).
Píše mi to chybu:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/server/www/user/login. (Reason: CORS preflight channel did not succeed).

Tady je můj kód na serveru:

public function actionLogin(){
    $data = $this->getRequest()->getPost();
    $this->sendResponse(new Response($this->getHttpRequest()->getHeaders()['authorization']));
}

Pro kontrolu, jestli v té hlavičce vůbec něco mám ji chci poslat zpět na klienta. Ostatní hlavičky se mi daří poslat ale tuto nikoliv.
Klientský kód:

let username="user@email.com";
let password = 123456
let headers: Headers = new Headers();
headers.append("Content-Type", "application/x-www-form-urlencoded");
headers.append("Authorization", "Basic " + btoa(username + ":" + password));
this.http.post('http://localhost/server/www/user/login',
  {email: username, password: password}, {headers: headers})
.subscribe(x => console.log(x.json()));

V čem může být problém? Existuje nějaký tutorial pro nette který by se zabýval problematikou REST API? Děkuji za rady.

Mysteria
Člen | 797
+
0
-

Nastuduj si tenhle odkaz, ten ti pomůže: https://developer.mozilla.org/…eb/HTTP/CORS

Každopádně ve zkratce jde o zabezpečení v tom smyslu, že když někam pošleš request, tak se pomocí hlaviček Access-Control-Allow-Origin, Access-Control-Allow-Methods a Access-Control-Allow-Headers dá nastavit, jestli ho budeš akceptovat nebo blokovat.

V tvým případě bude problém v nastavení Access-Control-Allow-Origin, že ti cílový server blokuje požadavky z localhostu, takže nejjednodušeji pro testování nastav u cíle aby posílal Access-Control-Allow-Origin: *, což povolí přístup odkudkoliv.

bluray
Člen | 178
+
0
-

V serverové části mám .htaccess:

Order Allow,Deny
Deny from all
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Credentials "true"
    Header set Access-Control-Allow-Methods "PUT, GET, POST"
    Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization"
</IfModule>

Klienta jsem upravil takto:

let username="user@email.com";
let password = 123456
let headers: Headers = new Headers();
headers.append("Content-Type", "application/x-www-form-urlencoded");
headers.append("Authorization", "Basic " + btoa(username + ":" + password));
headers.append('Access-Control-Allow-Origin', '*');
this.http.post('http://localhost/server/www/user/login',
  {email: username, password: password}, {headers: headers})
.subscribe(x => console.log(x.json()));

Problém ale stále trvá.

Editoval bluray (13. 11. 2017 18:59)

jiri.pudil
Nette Blogger | 1028
+
0
-

No a na jaké URL ti běží ten klient? Z jakého originu odchází HTTP požadavek?

bluray
Člen | 178
+
0
-

jiri.pudil napsal(a):

No a na jaké URL ti běží ten klient? Z jakého originu odchází HTTP požadavek?

Klient běží na url http://localhost:4200

jiri.pudil
Nette Blogger | 1028
+
0
-

V serverové části mám .htaccess:

Máš to ve správném .htaccess? Ve správné složce (v document rootu)? Podle toho Deny from all bych řekl, že ne

Pro tip: když si v Dev Tools prohlížeče otevřeš Network, můžeš se podívat, jaké požadavky se kam posílají a jaká odpověď s jakými hlavičkami se vrací.

Editoval jiri.pudil (14. 11. 2017 12:37)

bluray
Člen | 178
+
0
-

jiri.pudil napsal(a):

V serverové části mám .htaccess:

Máš to ve správném .htaccess? Ve správné složce (v document rootu)? Podle toho Deny from all bych řekl, že ne

Soubor .htaccess mám v rootu projektu, zkoušel jsem ho přidat i do složky www a zkoušel odstranit to Deny from all – výsledek stále stejný.

Jan Mikeš
Člen | 771
+
0
-

Ahoj @bluray před časem jsem řešil podobný problém, kdy apache i nginx mi úplně stripovali hlavičku Authorization. Četl jsem o tom dost, ale nikdy se mi to nepodařilo nakonfigurovat k plné funkčnosti, proto jsme přešli na alternativní hlavičku X-Authorization koneckonců ono je to úplně jedno, jaká hlavička se využívá, pokud se frontend a backend spolu domluví :-)

Čistě z programátorské zvědavosti, bych ti doporučil zkusit jinou hlavičku, jestli data se objeví, nebo ne, pak by bylo jasné, že tvůj problém je stejný jako ten, který jsem já vyřešit nedokázal.

Hledal bych něco na toto téma, jestli náhodou nemáš podobný problém, s jakým jsem se potkal já.

Editoval Jan Mikeš (14. 11. 2017 23:41)

bluray
Člen | 178
+
0
-

Ahoj díky za radu. Zkusil jsem nastavit X-Authorization do requestu na klientovi a na serveru do htaccess a bohužel je to pořád stejné. Ikdyž se mi teď objevuje jiná hláška:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/pocasi-server/www/user/login. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘(null)’).