Get Request работает в почтальоне, но не работает в браузере - PullRequest
12 голосов
/ 15 мая 2019

У меня есть веб-приложение, которое использует Angular7 на стороне клиента и CakePHP на Api Я использовал Basic Authentication, затем я заменяю его на Token Authentication все запросы работают нормально, кроме одного, который работает нормально только в Postman но в браузере это странно, потому что кажется, что есть проблема с аутентификацией, но она не может знать причину.

Запрос должен вернуть большой двоичный объект для загрузки файла, поэтому я использую FPDI в CakePHP вернуть pdf

Вот запрос у почтальона

Заголовок почтальона

Date →Wed, 15 May 2019 12:02:44 GMT
Server →Apache/2.4.33 (Win32) OpenSSL/1.0.2n PHP/5.6.35
X-Powered-By →PHP/5.6.35
Content-Disposition →inline; filename="doc.pdf"
Cache-Control →private, max-age=0, must-revalidate
Pragma →public
Access-Control-Allow-Origin →*
Keep-Alive →timeout=5, max=100
Connection →Keep-Alive
Transfer-Encoding →chunked
Content-Type →application/pdf

Тело почтальона Postman Body Запрос на Chrome Request on Chrome Рабочий запрос с использованием Basic Auth Working request using Basic Auth с использованием FireFox

using FireFox

Запрос вызова

    getWorkListPdf(id: number, cem_id?: number) {
    let uri = `${this.workSessionsUrl}workList/${id}`;
    let params = new HttpParams();
    if (cem_id) {
      params = params.set('cemetery_id', cem_id.toString());
    }
    const Auth = localStorage.getItem("AuthenticationToken");
    let header = new HttpHeaders();
      header = header.append("AuthenticationToken", Auth);
    return this.dataService.get(uri,{ headers: header, params: params, responseType: 'arraybuffer'  })
    .pipe(
      map(res => {
                  return res;
                }
      )
    );
  }

Любая помощь очень ценится!

Ответы [ 3 ]

7 голосов
/ 20 мая 2019

Проблема заключалась в том, что Api не может определить, что в запросе, который содержит необходимую информацию заголовка для аутентификации, я добавил массив Authentication в AppController, чтобы разрешить использование как Basic Auth, так и Token Auth при получении json запрос, это прекрасно работает для всех запросов, кроме этого (Скачать pdf) Я попытался снова добавить

$this->Auth->authenticate['Token'] = array(
                'fields' => array(
                ),
                // 'parameter' => '_token',
                'header' => 'AuthenticationToken',
                'scope' => array(
                    'User.permission_api_login' => true
                )
        );

в контроллер, и все работает отлично !!.похоже, что он может идентифицировать токен сейчас и вернуть действительный файл!

1 голос
/ 15 мая 2019

Добавить withCredentials true в вашем запросе.

const httpOptions = {
    headers: new HttpHeaders({
        'Accept': "application/json",
        'Content-Type': "text/plain;charset=UTF-8",
        'Authorization': 'Bearer ' + JSON.parse(your token)
    }), withCredentials: true
};
1 голос
/ 15 мая 2019

Если я полностью понимаю, вы хотите аутентифицироваться с токеном на предъявителя вместо базовой авторизации.Если вы хотите получить базовый уровень, вы можете использовать в своем запросе следующие заголовки:

const httpOptions = {
    headers: new HttpHeaders({ 
        'Content-Type': 'application/json',
        'Authorization': 'Basic ' + btoa('username:password')
    })
};

В случае авторизации на предъявителя вы можете сделать следующее:

const httpOptions = {
    headers: new HttpHeaders({ 
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + JSON.parse(your token)
    })
};

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...