REST API přihlašování – přístupo k http hlavičce Authorization
- bluray
- Člen | 178
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
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
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 | 1032
No a na jaké URL ti běží ten klient? Z jakého originu odchází HTTP požadavek?
- bluray
- Člen | 178
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 | 1032
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
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
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
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)’).