Мне нужно установить некоторые заголовки авторизации после того, как пользователь вошел в систему, для каждого последующего запроса.
Чтобы установить заголовки для конкретного запроса,
import {Headers} from 'angular2/http';
var headers = new Headers();
headers.append(headerName, value);
// HTTP POST using these headers
this.http.post(url, data, {
headers: headers
})
// do something with the response
Но было бы невозможно вручную установить заголовки запросов для каждого запроса таким образом.
Как установить заголовки после входа пользователя в систему, а также удалить эти заголовки при выходе?
Ответы:
Чтобы ответить на ваш вопрос, вы можете предоставить сервис, который оборачивает оригинальный
Http
объект из Angular. Нечто подобное описано ниже.И вместо инъекции
Http
объекта вы можете добавить этот (HttpClient
).Я также думаю, что что-то можно сделать, используя несколько провайдеров для
Http
класса, предоставив свой собственный класс, расширяющийHttp
один ... Смотрите эту ссылку: http://blog.thoughtram.io/angular2/2015/11/23/multi-providers -in-angular-2.html .источник
Bearer ${token}
, / \ "/ g, '')]);HTTP перехватчики теперь доступны через новый
HttpClient
из@angular/common/http
, в угловых версиях 4.3.x и за ее пределами .Теперь довольно просто добавить заголовок для каждого запроса:
Существует принцип неизменности , поэтому запрос необходимо клонировать, прежде чем устанавливать на него что-то новое.
Поскольку редактирование заголовков является очень распространенной задачей, на самом деле для этого есть ярлык (при клонировании запроса):
const clonedRequest = req.clone({ setHeaders: { Authorization: 'Bearer 123' } });
После создания перехватчика, вы должны зарегистрировать его, используя
HTTP_INTERCEPTORS
провайдера.источник
Расширение
BaseRequestOptions
может оказать большую помощь в этом сценарии. Проверьте следующий код:Это должно включать «My-Custom-Header» в каждом вызове.
Обновить:
Чтобы иметь возможность изменить заголовок в любое время, вместо кода выше, вы также можете использовать следующий код для добавления нового заголовка:
удалить вы можете сделать
Также есть еще одна функция, которую вы можете использовать для установки значения:
Вышеупомянутое решение все еще не полностью верно в контексте машинописи. _defaultHeaders защищен и не должен использоваться таким образом. Я бы порекомендовал вышеупомянутое решение для быстрого исправления, но в долгосрочной перспективе лучше написать свою собственную оболочку для вызовов http, которая также обрабатывает аутентификацию. Возьмите следующий пример из auth0, который лучше и чище.
https://github.com/auth0/angular2-jwt/blob/master/angular2-jwt.ts
Обновление - июнь 2018 г. Я вижу, что многие люди выбирают это решение, но я бы посоветовал иначе. Добавление заголовка глобально будет отправлять токен авторизации на каждый вызов API, исходящий из вашего приложения. Поэтому вызовы API, передаваемые сторонним плагинам, таким как внутренняя связь, Zendesk или любой другой API, также будут содержать ваш заголовок авторизации. Это может привести к серьезному недостатку безопасности. Поэтому вместо этого используйте перехватчик глобально, но проверьте вручную, направлен ли исходящий вызов к конечной точке API вашего сервера, и затем присоедините заголовок аутентификации.
источник
_defaultOptions
защищен, поэтому не может быть вызван из службыХотя я отвечаю на это очень поздно, но это может помочь кому-то еще. Чтобы внедрить заголовки во все запросы, когда они
@NgModule
используются, можно сделать следующее:(Я проверял это в Angular 2.0.1)
Теперь
@NgModule
сделайте следующее:источник
CustomRequestOptions
даже при использовании @ Inject / @ Injectable. Решение, которое я понял, было расширитьRequestOptions
, а неBaseRequestOptions
. ПредоставлениеBaseRequestOptions
не будет работать, но расширениеRequestOptions
вместо этого заставляет DI работать снова.Authorization
заголовок устанавливается только один раз в приложении init.В
Angular 2.1.2
Я подошел к этому, расширив угловую Http:затем в моих провайдерах приложений я смог использовать собственную фабрику для предоставления Http
Теперь мне не нужно объявлять каждый метод Http, и я могу использовать его
http
как обычно для всего приложения.источник
request()
Метод, который вы перегрузка, имеет две подписи вызова иoptions
свойство используется только тогда , когдаurl
указано в виде строки. В случае, когдаurl
это экземплярRequest
,options
свойство просто игнорируется. Это может привести к сложным ошибкам. Пожалуйста, смотрите мой ответ для более подробной информации.Создайте пользовательский класс Http, расширив Angular 2
Http
Provider, и просто переопределите методconstructor
andrequest
в своем пользовательском классе Http. В приведенном ниже примереAuthorization
заголовок добавляется в каждый http-запрос.Затем настройте ваш main
app.module.ts
для предоставления вXHRBackend
качествеConnectionBackend
провайдера иRequestOptions
вашего пользовательского класса Http:После этого вы можете теперь использовать свой собственный провайдер http в своих сервисах. Например:
Вот исчерпывающее руководство - http://adonespitogo.com/articles/angular-2-extending-http-provider/
источник
setRouter(router)
. Или вы можете создать другой класс и добавить туда свой собственный класс http вместо противоположного.Для Angular 5 и выше мы можем использовать HttpInterceptor для обобщения операций запроса и ответа. Это помогает нам избежать дублирования:
1) Общие заголовки
2) Указание типа ответа
3) Запрос запроса
Мы можем использовать этот класс AuthHttpInterceptor в качестве поставщика для HttpInterceptor:
источник
Лучше поздно, чем никогда ... =)
Вы можете взять концепцию расширенного
BaseRequestOptions
(отсюда https://angular.io/docs/ts/latest/guide/server-communication.html#!#override-default-request-options ) и обновить заголовки «на лету». "(не только в конструкторе). Вы можете использовать переопределение свойства «заголовки» getter / setter следующим образом:источник
Так я делал для установки токена при каждом запросе.
И зарегистрируйтесь в app.module.ts
источник
Вот улучшенная версия принятого ответа, обновленная для финала Angular2:
Конечно, он должен быть расширен для таких методов, как
delete
иput
при необходимости (они мне пока не нужны на данном этапе моего проекта).Преимущество состоит в том, что в методах
get
/post
/ ... меньше дублирующегося кода .Обратите внимание, что в моем случае я использую куки для аутентификации. Мне нужен заголовок для i18n (
Accept-Language
заголовок), потому что многие значения, возвращаемые нашим API, переводятся на язык пользователя. В моем приложении сервис i18n содержит язык, выбранный пользователем.источник
Как насчет поддержания отдельного сервиса, как следует
и когда вы звоните это из другого места, используйте
this.httpClientService.addHeader("Authorization", "Bearer " + this.tok);
и вы увидите добавленный заголовок, например: - Авторизация следующим образом
источник
После некоторого расследования я обнаружил, что последний и самый простой способ - это расширение,
BaseRequestOptions
которое я предпочитаю.Ниже приведены способы, по которым я пытался и по какой-то причине отказаться:
1. расширить
BaseRequestOptions
и добавить динамические заголовкиconstructor()
. Это не может работать, если я войду. Он будет создан один раз. Так что это не динамично.2. продлить
Http
. По той же причине, что и выше, я не могу добавить динамические заголовки вconstructor()
. И если я переписываюrequest(..)
метод и устанавливаю заголовки, вот так:Вам просто нужно переписать этот метод, но не все методы get / post / put.
3. И мое предпочтительное решение - расширить
BaseRequestOptions
и переписатьmerge()
:эта
merge()
функция будет вызываться для каждого запроса.источник
BaseRequestOptions
. Однако, к сожалению, это не сработало для меня. какие-либо возможные причины?AuthRequestOptions
к остальной части приложения? Я попытался поместить это вproviders
раздел, но он ничего не сделал.RequestOptions
, а неBaseRequestOptions
. angular.io/api/http/BaseRequestOptions{ provide: RequestOptions, useClass: AuthRequestOptions }
Хотя я отвечаю на это очень поздно, но если кто-то ищет более простое решение.
Мы можем использовать angular2-jwt. angular2-jwt полезен для автоматического подключения веб-токена JSON (JWT) в качестве заголовка авторизации при выполнении HTTP-запросов из приложения Angular 2.
Мы можем установить глобальные заголовки с расширенной опцией конфигурации
И отправка за запрос токена вроде
источник
Мне нравится идея переопределить параметры по умолчанию, это кажется хорошим решением.
Тем не менее, если вы собираетесь расширить
Http
класс. Обязательно прочитайте это до конца!Некоторые ответы здесь на самом деле показывают неправильную перегрузку
request()
метода, что может привести к трудно обнаруживаемым ошибкам и странному поведению. Я наткнулся на это сам.Это решение основано на
request()
реализации метода в Angular4.2.x
, но должно быть совместимым с будущим:Обратите внимание, что я импортирую оригинальный класс таким образом
import { Http as NgHttp } from '@angular/http';
, чтобы предотвратить конфликт имен.И вот пример того, как зарегистрировать этот переопределенный класс в контейнере DI:
При таком подходе вы можете вводить
Http
класс обычным способом, но вместо этого ваш переопределенный класс будет вводиться магическим образом. Это позволяет вам легко интегрировать ваше решение, не изменяя другие части приложения (полиморфизм в действии).Просто добавьте
httpProvider
вproviders
свойство метаданных вашего модуля.источник
Самый простой из всех
Создать
config.ts
файлЗатем по вашему
service
, просто импортируйтеconfig.ts
файлЯ думаю, что это было самым простым и самым безопасным.
источник
Произошли некоторые изменения для угловых 2.0.1 и выше:
источник
У меня есть возможность выбрать более простое решение> Добавить новые заголовки к параметрам слияния по умолчанию или загрузить с помощью вашей функции API (или другой).
Конечно, вы можете использовать этот заголовок в параметрах по умолчанию или в вашем классе. Это в сгенерированном Ionic API-интерфейсе класса экспорта api.ts @Injectable () {}
Это очень быстро, и это работает для меня. Я не хотел формат JSON / LD.
источник
Вы можете использовать
canActive
в своих маршрутах, например, так:Взято из: https://auth0.com/blog/angular-2-authentication
источник