Угловой вход в систему с учетными данными: true не работает - PullRequest
0 голосов
/ 22 ноября 2018

Вход в систему с использованием restAPIfails в браузере, но работает в почтальоне.

вот мой угловой код для входа в систему, который выбрасывает меня 401

    login(username: string, password: string) {
    const httpHeaders = new HttpHeaders()
                     .set('Accept', 'application/json')
                     .set('Content-Type', 'application/x-www-form-urlencoded');
    return this.http.post<any>(environment.apiUrl + '/api/core/login',
     JSON.stringify({ 'username': username, 'password': password }), {withCredentials: true, headers: httpHeaders})
        .pipe(map(response => {
            // login successful if there's a jwt token in the response
            const token = response.headers.get('Lemon-Authorization');
            if (response.status === 200 && token) {
                // store user details and jwt token in local storage to keep user logged in between page refreshes
                localStorage.setItem('authHeader', 'Bearer ' + token);
                this.currentUserSubject.next(response.body.user);
            }

            return response.body.user;
        }));
}

401 в chrome: faliureв хроме

200 OK в почтальоне: успех в почтальоне

что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Я думаю, что причина может быть в том, что вы JSON жалеете тело запроса, тогда как оно должно быть application/x-www-form-urlencoded, то есть username=abc&password=xyz.Вы можете посмотреть на работающий демонстрационный код Spring Lemon для таких проблем, например, этот .

0 голосов
/ 22 ноября 2018

вот рабочий код:

 login(username: string, password: string) {
            const body = new URLSearchParams();
            body.set('username', username);
            body.set('password', password);
            const options = {
                headers: new HttpHeaders()
                    .set('Accept', 'application/json')
                    .set('Content-Type', 'application/x-www-form-urlencoded'),
                withCredentials: true
            };
            return this.http.post<any>(environment.apiUrl + '/api/core/login',
                body.toString(), options)
                .pipe(map(response => {
                    // login successful if there's a jwt token in the response
                    const token = response.headers.get('Lemon-Authorization');
                    if (response.status === 200 && token) {
                        // store user details and jwt token in local storage to keep user logged in between page refreshes
                        localStorage.setItem('authHeader', 'Bearer ' + token);
                        this.currentUserSubject.next(response.body.user);
                    }

                    return response.body.user;
                }));
        }

подробнее здесь - Как заставить Angular2 POST с помощью x-www-form-urlencoded

0 голосов
/ 22 ноября 2018

Я полагаю, вы столкнулись с известной проблемой CORS.Причина, по которой он работает на почтальоне, заключается в том, что он не выполняет вызываемый preflight запрос, который браузеры выполняют при отправке заголовков аутентификации.

Вы, вероятно, увидите в своих запросах в браузере, что неудавшийся запрос - OPTIONS, а не 'POST'.Если это так, это означает, что в конфигурации вашего сервера отсутствуют CORS конфигурации.

...