Preciso definir alguns cabeçalhos de autorização após o login do usuário, para cada solicitação subseqüente.
Para definir cabeçalhos para uma solicitação específica,
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
Mas não seria viável definir manualmente cabeçalhos de solicitação para cada solicitação dessa maneira.
Como definir os cabeçalhos depois que o usuário efetuar login e também removê-los no logout?
Respostas:
Para responder, você pergunta que poderia fornecer um serviço que agrupa o
Http
objeto original do Angular. Algo como descrito abaixo.E em vez de injetar o
Http
objeto, você pode injetar este (HttpClient
).Eu também acho que algo poderia ser feito usando vários provedores para a
Http
classe, fornecendo sua própria classe estendendo aHttp
... Consulte este link: http://blog.thoughtram.io/angular2/2015/11/23/multi-providers -em-angular-2.html .fonte
Bearer ${token}
, / \ "/ g, '')]);Os interceptores HTTP agora estão disponíveis através do novo
HttpClient
from@angular/common/http
, a partir das versões Angular 4.3.x e além .É muito simples adicionar um cabeçalho para cada solicitação agora:
Existe um princípio de imutabilidade , é por isso que a solicitação precisa ser clonada antes de definir algo novo.
Como editar cabeçalhos é uma tarefa muito comum, na verdade há um atalho para ele (ao clonar a solicitação):
const clonedRequest = req.clone({ setHeaders: { Authorization: 'Bearer 123' } });
Depois de criar o interceptador, você deve registrá-lo usando o
HTTP_INTERCEPTORS
fornecimento.fonte
A extensão
BaseRequestOptions
pode ser de grande ajuda nesse cenário. Confira o seguinte código:Isso deve incluir 'Meu cabeçalho personalizado' em todas as chamadas.
Atualizar:
Para poder alterar o cabeçalho a qualquer momento, em vez do código acima, você também pode usar o código a seguir para adicionar um novo cabeçalho:
para excluir você pode fazer
Também há outra função que você pode usar para definir o valor:
A solução acima ainda não é completamente válida no contexto datilografado. _defaultHeaders está protegido e não deve ser usado assim. Eu recomendaria a solução acima para uma solução rápida, mas, a longo prazo, é melhor escrever seu próprio wrapper em torno de chamadas http, que também lida com auth. Veja o exemplo a seguir de auth0, que é melhor e limpo.
https://github.com/auth0/angular2-jwt/blob/master/angular2-jwt.ts
Atualização - junho de 2018 Vejo muitas pessoas optando por esta solução, mas aconselho o contrário. Anexar cabeçalho globalmente enviará o token de autenticação para todas as chamadas da API que saem do seu aplicativo. Portanto, as chamadas da API que acessam plugins de terceiros, como interfone ou zendesk ou qualquer outra API, também carregam seu cabeçalho de autorização. Isso pode resultar em uma grande falha de segurança. Então, em vez disso, use o interceptador globalmente, mas verifique manualmente se a chamada de saída está direcionada para o terminal da API do servidor ou não e, em seguida, anexe o cabeçalho de autenticação.
fonte
_defaultOptions
está protegido de forma não pode ser chamado de serviçoEmbora eu esteja respondendo muito tarde, isso pode ajudar outra pessoa. Para injetar cabeçalhos em todas as solicitações quando
@NgModule
usado, pode-se fazer o seguinte:(Eu testei isso no Angular 2.0.1)
Agora,
@NgModule
faça o seguinte:fonte
CustomRequestOptions
mesmo ao usar @ Inject / @ Injectable. A solução que percebi foi estenderRequestOptions
, nãoBaseRequestOptions
. FornecerBaseRequestOptions
não funcionará, mas estender fará comRequestOptions
que o DI funcione novamente.Authorization
cabeçalho é definido apenas uma vez no init do aplicativo.Em
Angular 2.1.2
eu aproximei isso estendendo o Http angular:então, em meus fornecedores de aplicativos, pude usar uma fábrica personalizada para fornecer 'Http'
agora não preciso declarar todos os métodos Http e posso usá-
http
los normalmente em todo o meu aplicativo.fonte
request()
método, que você está sobrecarregando, possui duas assinaturas de chamada e aoptions
propriedade é usada apenas quandourl
especificada como string. Casourl
seja uma instância deRequest
, aoptions
propriedade será ignorada. Isso pode levar a erros difíceis de detectar. Por favor, veja minha resposta para mais detalhes.Crie uma classe Http personalizada estendendo o
Http
provedor Angular 2 e simplesmente substitua o métodoconstructor
erequest
na sua classe Http personalizada. O exemplo abaixo adicionaAuthorization
cabeçalho em cada solicitação http.Em seguida, configure seu main
app.module.ts
para fornecerXHRBackend
como oConnectionBackend
provedor e aRequestOptions
sua classe Http personalizada:Depois disso, agora você pode usar seu provedor http personalizado em seus serviços. Por exemplo:
Aqui está um guia completo - http://adonespitogo.com/articles/angular-2-extending-http-provider/
fonte
setRouter(router)
. Ou você pode criar outra classe e injetar sua classe http personalizada lá em vez do contrário.Para o Angular 5 e superior, podemos usar o HttpInterceptor para generalizar as operações de solicitação e resposta. Isso nos ajuda a evitar duplicar:
1) Cabeçalhos comuns
2) Especificando o tipo de resposta
3) Solicitação de consulta
Podemos usar esta classe AuthHttpInterceptor como um provedor para os HttpInterceptors:
fonte
Antes tarde do que nunca ... =)
Você pode adotar o conceito de extended
BaseRequestOptions
(a partir daqui https://angular.io/docs/ts/latest/guide/server-communication.html#!#override-default-request-options ) e atualizar os cabeçalhos "on the fly "(não apenas no construtor). Você pode usar a substituição de propriedade "cabeçalhos" getter / setter da seguinte maneira:fonte
Foi assim que eu fiz para definir o token com cada solicitação.
E registre-se em app.module.ts
fonte
Aqui está uma versão aprimorada da resposta aceita, atualizada para a final do Angular2:
É claro que deve ser estendido para métodos como
delete
e,put
se necessário (ainda não os necessito neste momento do meu projeto).A vantagem é que há menos código duplicado nos métodos
get
/post
/ ....Observe que, no meu caso, eu uso cookies para autenticação. Eu precisava do cabeçalho para i18n (o
Accept-Language
cabeçalho) porque muitos valores retornados por nossa API são traduzidos no idioma do usuário. No meu aplicativo, o serviço i18n contém o idioma atualmente selecionado pelo usuário.fonte
Que tal Manter um Serviço Separado, como segue
e quando você chama isso de outro lugar, use
this.httpClientService.addHeader("Authorization", "Bearer " + this.tok);
e você verá o cabeçalho adicionado, por exemplo: - Autorização da seguinte forma
fonte
Após alguma investigação, achei a maneira final e mais fácil de estender a
BaseRequestOptions
que prefiro.A seguir, apresentamos as maneiras pelas quais tentei desistir por algum motivo:
1. estenda
BaseRequestOptions
e inclua cabeçalhos dinâmicosconstructor()
. Não pode funcionar se eu entrar. Será criado uma vez. Portanto, não é dinâmico.2. estender
Http
. Mesmo motivo acima, não consigo adicionar cabeçalhos dinâmicosconstructor()
. E se eu reescrever orequest(..)
método e definir cabeçalhos, assim:Você só precisa sobrescrever esse método, mas nem todos os métodos get / post / put.
3.E minha solução preferida é estender
BaseRequestOptions
e substituirmerge()
:essa
merge()
função será chamada para cada solicitação.fonte
BaseRequestOptions
. No entanto, infelizmente, isso não funcionou para mim. alguma razão possível?AuthRequestOptions
ao resto do aplicativo? Tentei colocar isso naproviders
seção, mas não fez nada.RequestOptions
, nãoBaseRequestOptions
. angular.io/api/http/BaseRequestOptions{ provide: RequestOptions, useClass: AuthRequestOptions }
Embora eu esteja respondendo isso muito tarde, mas se alguém estiver procurando uma solução mais fácil.
Podemos usar angular2-jwt. angular2-jwt é útil anexar automaticamente um JSON Web Token (JWT) como um cabeçalho de autorização ao fazer solicitações HTTP de um aplicativo Angular 2.
Podemos definir cabeçalhos globais com opção de configuração avançada
E enviando por token de solicitação como
fonte
Eu gosto da ideia de substituir as opções padrão, essa parece ser uma boa solução.
No entanto, se você estiver disposto a estender o
Http
classe. Não deixe de ler isso!Algumas respostas aqui estão realmente mostrando sobrecarga incorreta de
request()
método, o que pode levar a erros difíceis de capturar e comportamento estranho. Eu já me deparei com isso.Esta solução é baseada na
request()
implementação do método em Angular4.2.x
, mas deve ser compatível com o futuro:Observe que estou importando a classe original dessa maneira
import { Http as NgHttp } from '@angular/http';
para evitar conflitos de nome.E aqui está o exemplo de como registrar essa classe substituída no contêiner DI:
Com essa abordagem, você pode injetar
Http
classe normalmente, mas sua classe substituída será injetada magicamente. Isso permite que você integre sua solução facilmente, sem alterar outras partes do aplicativo (polimorfismo em ação).Basta adicionar
httpProvider
àproviders
propriedade dos metadados do seu módulo.fonte
O mais simples de todos
Crie um
config.ts
arquivoEm seguida, no seu
service
, basta importar oconfig.ts
arquivoEu acho que foi o mais simples e o mais seguro.
fonte
Houve algumas alterações no angular 2.0.1 e superior:
fonte
Consegui escolher uma solução mais simples> Adicionar novos cabeçalhos às opções padrão mesclar ou carregar por sua função api get (ou outra).
Claro que você pode externalizar esses cabeçalhos nas opções padrão ou em qualquer outra classe da sua classe. Isso está na API de classe de exportação api.ts @Injectable () gerada pelo Ionic {}
É muito rápido e funciona para mim. Eu não queria o formato json / ld.
fonte
Você pode usar
canActive
em suas rotas, assim:Retirado de: https://auth0.com/blog/angular-2-authentication
fonte