2016-09-09 33 views
25

Jak dodać nagłówki do żądania http w Angular2 RC6? mam następujący kod:http post - jak wysłać nagłówek autoryzacji?

login(login: String, password: String): Observable<boolean> { 
    console.log(login); 
    console.log(password); 
    this.cookieService.removeAll(); 
    let headers = new Headers(); 
    headers.append("Authorization","Basic YW5ndWxhci13YXJlaG91c2Utc2VydmljZXM6MTIzNDU2"); 
    this.http.post(AUTHENTICATION_ENDPOINT + "?grant_type=password&scope=trust&username=" + login + "&password=" + password, null, {headers: headers}).subscribe(response => { 
     console.log(response); 
    }); 
    //some return 
} 

Problem polega na tym, że kątowa nie dodaje nagłówek Authorization. Zamiast tego we wniosku widzę następujące dodatkowe nagłówki:

Access-Control-Request-Headers:authorization 
Access-Control-Request-Method:POST 

i SDCH dodane w Accept-Encoding:

Accept-Encoding:gzip, deflate, sdch 

Unfornately nie ma nagłówka Authorization. Jak powinienem dodać go poprawnie?

Cały wniosek wysłany przez mojego kodu wygląda następująco:

OPTIONS /oauth/token?grant_type=password&scope=trust&username=asdf&password=asdf HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Access-Control-Request-Method: POST 
Origin: http://localhost:3002 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 
Access-Control-Request-Headers: authorization 
Accept: */* 
Referer: http://localhost:3002/login 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,pl;q=0.6 
+0

Czy próbowałeś podać własne opcje żądań? http://stackoverflow.com/a/35047978/4102561 – Supamiu

+0

@Supamiu Nieumiejętnie to rozwiązanie nie działa. Próbowałem: this.http._defaultOptions.headers.set ("Autoryzacja", "Basic YW5ndWxhci13YXJlaG91c2Utc2VydmljZXM6MTIzNDU2"); Otrzymałem te same wyniki. –

+1

Żądanie, które pokazałeś w pytaniu, to żądanie inspekcji "OPCJE", czy możesz dodać prośbę POST? (Powinno to być zaraz po tym w zakładce sieci) – Supamiu

Odpowiedz

18

Ok. Znalazłem problem.

To nie było po stronie Angular. Szczerze mówiąc, nie było żadnego problemu.

Powodem, dla którego nie mogłem wykonać mojej prośby, było to, że moja aplikacja serwera nieprawidłowo obsługiwała żądanie OPTIONS.

Dlaczego OPTIONS, a nie POST? Moja aplikacja serwera znajduje się na innym hoście, a następnie na interfejsie użytkownika. Ze względu CORS moja przeglądarka została konwersja pocztą na opcję: http://restlet.com/blog/2015/12/15/understanding-and-using-cors/

Przy pomocy tej odpowiedzi: Standalone Spring OAuth2 JWT Authorization Server + CORS

I wdrożone odpowiedniego filtra na mojej stronie serwera aplikacji.

Podziękowania dla @Supamiu - osoby, która dotknęła mnie, że w ogóle nie wysyłam POST.

+6

Wysyła "OPTIONS" jako żądanie wstępne, a następnie "POST" 'jeśli wszystko idzie dobrze, nie zastępuje' POST' z 'OPCJAMI'. – Oskar

5

wierzę trzeba mapować wynik, zanim do niej zapisać. Skonfigurować go tak:

updateProfileInformation(user: User) { 
    var headers = new Headers(); 
    headers.append('Content-Type', this.constants.jsonContentType); 

    var t = localStorage.getItem("accessToken"); 
    headers.append("Authorization", "Bearer " + t; 
    var body = JSON.stringify(user); 

    return this.http.post(this.constants.userUrl + "UpdateUser", body, { headers: headers }) 
     .map((response: Response) => { 
     var result = response.json(); 
     return result; 
     }) 
     .catch(this.handleError) 
     .subscribe(
     status => this.statusMessage = status, 
     error => this.errorMessage = error, 
    () => this.completeUpdateUser() 
    ); 
    } 
+0

Nie chodzi o to, jak sobie poradzić z odpowiedzią http **, ale jak dodać właściwy nagłówek do ** zapytania **. Na pewno sprawdziłem twoją propozycję - nie działa, wysłane nagłówki są nadal takie same. –

+0

To działa w mojej aplikacji.Używam go cały czas. –

+0

Jaką wersję kąta masz? –

12

trzeba RequestOptions

let headers = new Headers({'Content-Type': 'application/json'}); 
headers.append('Authorization','Bearer ') 
let options = new RequestOptions({headers: headers}); 
return this.http.post(APIname,body,options) 
    .map(this.extractData) 
    .catch(this.handleError); 

dłużej sprawdzić link