Saya perlu menetapkan beberapa tajuk Otorisasi setelah pengguna masuk, untuk setiap permintaan berikutnya.
Untuk mengatur tajuk untuk permintaan tertentu,
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
Tetapi tidak mungkin untuk mengatur header permintaan secara manual untuk setiap permintaan dengan cara ini.
Bagaimana cara mengatur set header setelah pengguna masuk, dan juga menghapus header itu saat keluar?
Jawaban:
Untuk menjawab, Anda mempertanyakan apakah Anda dapat menyediakan layanan yang membungkus
Http
objek asli dari Angular. Sesuatu seperti dijelaskan di bawah ini.Dan alih-alih menyuntikkan
Http
objek Anda bisa menyuntikkan yang ini (HttpClient
).Saya juga berpikir bahwa sesuatu dapat dilakukan dengan menggunakan penyedia multi untuk
Http
kelas dengan menyediakan kelas Anda sendiri memperluasHttp
satu ... Lihat tautan ini: http://blog.thoughtram.io/angular2/2015/11/23/multi-providers -in-angular-2.html .sumber
Bearer ${token}
, / \ "/ g, '')]);Pencegat HTTP sekarang tersedia melalui yang baru
HttpClient
dari@angular/common/http
, pada versi 4.3.x Angular dan seterusnya .Cukup mudah untuk menambahkan header untuk setiap permintaan sekarang:
Ada prinsip kekekalan , itulah alasan permintaan harus dikloning sebelum menetapkan sesuatu yang baru di atasnya.
Karena mengedit tajuk adalah tugas yang sangat umum, sebenarnya ada jalan pintas untuk itu (sambil mengkloning permintaan):
const clonedRequest = req.clone({ setHeaders: { Authorization: 'Bearer 123' } });
Setelah membuat interseptor, Anda harus mendaftarkannya menggunakan penawaran
HTTP_INTERCEPTORS
.sumber
Memperluas
BaseRequestOptions
mungkin sangat membantu dalam skenario ini. Lihat kode berikut:Ini harus mencakup 'My-Custom-Header' di setiap panggilan.
Memperbarui:
Untuk dapat mengubah tajuk kapan saja Anda inginkan alih-alih kode di atas, Anda juga dapat menggunakan kode berikut untuk menambahkan tajuk baru:
untuk menghapus bisa Anda lakukan
Juga ada fungsi lain yang dapat Anda gunakan untuk mengatur nilai:
Solusi di atas masih belum sepenuhnya valid dalam konteks naskah. _defaultHeaders dilindungi dan tidak seharusnya digunakan seperti ini. Saya akan merekomendasikan solusi di atas untuk perbaikan cepat tetapi untuk jangka panjang lebih baik untuk menulis bungkus Anda sendiri di sekitar panggilan http yang juga menangani auth. Ambil contoh berikut dari auth0 yang lebih baik dan bersih.
https://github.com/auth0/angular2-jwt/blob/master/angular2-jwt.ts
Pembaruan - Juni 2018 Saya melihat banyak orang mencari solusi ini, tetapi saya menyarankan sebaliknya. Menambah tajuk secara global akan mengirimkan token autentikasi ke setiap panggilan api yang keluar dari aplikasi Anda. Jadi panggilan api pergi ke plugin pihak ketiga seperti interkom atau zendesk atau api lain juga akan membawa header otorisasi Anda. Ini mungkin menghasilkan kelemahan keamanan yang besar. Jadi alih-alih, gunakan interceptor secara global tetapi periksa secara manual apakah panggilan keluar menuju titik akhir api server Anda atau tidak dan kemudian pasang tajuk auth.
sumber
_defaultOptions
dilindungi sehingga tidak dapat dipanggil dari layananMeskipun saya menjawabnya sangat terlambat tetapi mungkin membantu orang lain. Untuk menyuntikkan tajuk ke semua permintaan saat
@NgModule
digunakan, seseorang dapat melakukan hal berikut:(Saya menguji ini dalam Angular 2.0.1)
Sekarang
@NgModule
lakukan hal berikut:sumber
CustomRequestOptions
bahkan ketika menggunakan @ Suntik / @ Suntik. Solusi yang saya sadari adalah memperluasRequestOptions
, bukanBaseRequestOptions
. MemberiBaseRequestOptions
tidak akan berhasil, tetapi memperluasRequestOptions
malah membuat DI berfungsi lagi.Authorization
header diatur hanya sekali pada aplikasi init.Dalam
Angular 2.1.2
saya mendekati ini dengan memperluas sudut Http:kemudian di Penyedia Aplikasi saya, saya dapat menggunakan Pabrik kustom untuk memberikan 'Http'
sekarang saya tidak perlu mendeklarasikan setiap metode Http dan dapat digunakan
http
seperti biasa di seluruh aplikasi saya.sumber
request()
metode, yang Anda overloading, memiliki dua tanda tangan panggilan danoptions
properti digunakan hanya ketikaurl
ditetapkan sebagai string. Dalam kasus di manaurl
turunan dariRequest
,options
properti hanya diabaikan. Ini bisa menyebabkan kesalahan yang sulit ditangkap. Silakan lihat jawaban saya untuk lebih jelasnya.Buat kelas Http kustom dengan memperluas
Http
Penyedia Angular 2 dan cukup menimpaconstructor
danrequest
metode di kelas Http kustom Anda. Contoh di bawah ini menambahkanAuthorization
header di setiap permintaan http.Kemudian konfigurasikan main Anda
app.module.ts
untuk menyediakanXHRBackend
sebagaiConnectionBackend
penyedia danRequestOptions
untuk kelas Http kustom Anda:Setelah itu, Anda sekarang dapat menggunakan penyedia http khusus Anda di layanan Anda. Sebagai contoh:
Inilah panduan komprehensif - http://adonespitogo.com/articles/angular-2-extending-http-provider/
sumber
setRouter(router)
. Atau Anda dapat membuat kelas lain dan menyuntikkan kelas http kustom Anda di sana, bukan sebaliknya.Untuk Angular 5 ke atas, kita dapat menggunakan HttpInterceptor untuk menggeneralisasi operasi permintaan dan respons. Ini membantu kami menghindari duplikasi:
1) Header umum
2) Menentukan jenis respons
3) Permintaan kueri
Kita dapat menggunakan kelas AuthHttpInterceptor ini sebagai penyedia untuk HttpInterceptors:
sumber
Lebih baik terlambat daripada tidak pernah ... =)
Anda dapat mengambil konsep extended
BaseRequestOptions
(dari sini https://angular.io/docs/ts/latest/guide/server-communication.html#!#override-default-request-options ) dan menyegarkan header "dengan cepat "(tidak hanya dalam konstruktor). Anda dapat menggunakan override properti pengambil / setter "header" seperti ini:sumber
Inilah yang saya lakukan untuk menyetel token dengan setiap permintaan.
Dan mendaftar di app.module.ts
sumber
Berikut ini adalah versi perbaikan dari jawaban yang diterima, diperbarui untuk final Angular2:
Tentu saja harus diperluas untuk metode seperti
delete
danput
jika diperlukan (saya belum membutuhkannya pada saat ini dalam proyek saya).Keuntungannya adalah ada lebih sedikit kode yang digandakan dalam metode
get
/post
/ ....Perhatikan bahwa dalam kasus saya, saya menggunakan cookie untuk otentikasi. Saya membutuhkan tajuk untuk i18n (
Accept-Language
tajuk) karena banyak nilai yang dikembalikan oleh API kami diterjemahkan dalam bahasa pengguna. Di aplikasi saya, layanan i18n menampung bahasa yang saat ini dipilih oleh pengguna.sumber
Bagaimana dengan Menjaga Layanan Terpisah seperti berikut
dan ketika Anda memanggil ini dari tempat lain gunakan
this.httpClientService.addHeader("Authorization", "Bearer " + this.tok);
dan Anda akan melihat tajuk yang ditambahkan misalnya: - Otorisasi sebagai berikut
sumber
Setelah beberapa penyelidikan, saya menemukan cara terakhir dan paling mudah adalah dengan memperpanjang
BaseRequestOptions
yang saya inginkan.Berikut ini adalah cara saya mencoba dan menyerah karena beberapa alasan:
1. memperluas
BaseRequestOptions
, dan menambahkan header dinamis diconstructor()
. Itu tidak bisa berfungsi jika saya login. Itu akan dibuat sekali. Jadi tidak dinamis.2. memperpanjang
Http
. Alasan yang sama seperti di atas, saya tidak dapat menambahkan header dinamis diconstructor()
. Dan jika saya menulis ulangrequest(..)
metode, dan mengatur tajuk, seperti ini:Anda hanya perlu menimpa metode ini, tetapi tidak setiap metode get / post / put.
3. Dan solusi pilihan saya adalah rentangkan
BaseRequestOptions
dan timpamerge()
:merge()
fungsi ini akan dipanggil untuk setiap permintaan.sumber
BaseRequestOptions
. Namun, sayangnya, ini tidak berhasil untuk saya. ada kemungkinan alasan?AuthRequestOptions
aplikasi lainnya? Saya mencoba meletakkan ini diproviders
bagian tetapi tidak melakukan apa-apa.RequestOptions
, bukanBaseRequestOptions
. angular.io/api/http/BaseRequestOptions{ provide: RequestOptions, useClass: AuthRequestOptions }
Meskipun saya menjawab ini sangat terlambat tetapi jika ada yang mencari solusi yang lebih mudah.
Kita bisa menggunakan angular2-jwt. angular2-jwt berguna secara otomatis melampirkan JSON Web Token (JWT) sebagai header Otorisasi ketika membuat permintaan HTTP dari aplikasi Angular 2.
Kita dapat mengatur tajuk global dengan opsi konfigurasi lanjutan
Dan mengirim token per permintaan seperti
sumber
Saya suka ide untuk menimpa opsi default, ini sepertinya solusi yang bagus.
Namun, jika Anda ingin memperluas
Http
kelas. Pastikan untuk membaca ini sampai selesai!Beberapa jawaban di sini sebenarnya menunjukkan kelebihan
request()
metode yang tidak benar , yang dapat menyebabkan kesalahan yang sulit ditangkap dan perilaku aneh. Saya sendiri telah menemukan ini.Solusi ini didasarkan pada
request()
implementasi metode di Angular4.2.x
, tetapi harus kompatibel di masa depan:Perhatikan bahwa saya mengimpor kelas asli dengan cara ini
import { Http as NgHttp } from '@angular/http';
untuk mencegah bentrokan nama.Dan inilah contoh cara mendaftarkan kelas yang diganti ini dengan wadah DI:
Dengan pendekatan seperti itu Anda bisa menyuntikkan
Http
kelas secara normal, tetapi kelas yang diganti Anda akan disuntikkan secara ajaib. Ini memungkinkan Anda untuk mengintegrasikan solusi Anda dengan mudah tanpa mengubah bagian lain dari aplikasi (polimorfisme sedang bekerja).Cukup tambahkan
httpProvider
keproviders
properti metadata modul Anda.sumber
Yang paling sederhana
Buat
config.ts
fileKemudian pada Anda
service
, cukup imporconfig.ts
fileSaya pikir itu yang paling sederhana dan paling aman.
sumber
Ada beberapa perubahan untuk sudut 2.0.1 dan lebih tinggi:
sumber
Saya telah dapat memilih solusi yang lebih sederhana> Tambahkan Header baru ke opsi default menggabungkan atau memuat dengan fungsi get (atau lainnya) api Anda.
Tentu saja Anda dapat mengeksternalkan Header ini dalam opsi default atau apa pun di kelas Anda. Ini ada di API ekspor kelas.onic @Injectable () yang dihasilkan Ionic {}
Ini sangat cepat dan bekerja untuk saya. Saya tidak ingin format json / ld.
sumber
Anda dapat menggunakan
canActive
rute Anda, seperti:Diambil dari: https://auth0.com/blog/angular-2-authentication
sumber