Rumah >hujung hadapan web >tutorial js >Melaksanakan pengesahan dalam aplikasi sudut
mata utama
Dalam aplikasi yang didorong oleh pelayan tradisional dan aplikasi satu halaman, pelaksanaan pengurusan pengguna adalah berbeza. Satu -satunya cara spa berinteraksi dengan komponen pelayannya adalah melalui Ajax. Ini benar walaupun untuk log masuk dan logout.
Pelayan yang bertanggungjawab untuk mengenal pasti pengguna mesti mendedahkan titik akhir pengesahan. Spa akan menghantar kelayakan yang dimasukkan ke pengguna ke titik akhir ini untuk pengesahan. Dalam sistem pengesahan berasaskan token yang tipikal, perkhidmatan boleh mengembalikan token akses atau objek yang mengandungi nama dan peranan pengguna log masuk selepas pengesahan kelayakan. Pelanggan mesti menggunakan token akses ini dalam semua permintaan API selamat yang dibuat ke pelayan.
Oleh kerana token akses akan digunakan beberapa kali, sebaiknya menyimpannya pada pelanggan. Dalam sudut, kita boleh menyimpan nilai dalam perkhidmatan atau nilai kerana mereka adalah objek singleton pada pelanggan. Walau bagaimanapun, jika pengguna menyegarkan halaman, nilai dalam perkhidmatan atau nilai akan hilang. Dalam kes ini, lebih baik menggunakan salah satu mekanisme ketekunan yang disediakan oleh penyemak imbas untuk menyimpan token;
mencapai login
mari kita lihat beberapa kod sekarang. Katakan kami telah melaksanakan semua logik sisi pelayan dan perkhidmatan mendedahkan titik akhir REST di /API /Login untuk memeriksa kelayakan log masuk dan mengembalikan token akses. Mari kita tulis perkhidmatan mudah yang melakukan operasi log masuk dengan mengakses titik akhir pengesahan. Kami akan menambah lebih banyak ciri untuk perkhidmatan ini kemudian:
<code class="language-javascript">app.factory("authenticationSvc", function($http, $q, $window) { var userInfo; function login(userName, password) { var deferred = $q.defer(); $http.post("/api/login", { userName: userName, password: password }).then(function(result) { userInfo = { accessToken: result.data.access_token, userName: result.data.userName }; $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); deferred.resolve(userInfo); }, function(error) { deferred.reject(error); }); return deferred.promise; } return { login: login }; });</code>
Dalam kod sebenar, anda mungkin mahu refactor pernyataan yang menyimpan data ke sessionStorage ke dalam perkhidmatan yang berasingan, kerana jika kita melakukan ini, perkhidmatan ini akan mengambil pelbagai tanggungjawab. Untuk memastikan demo mudah, saya menyimpannya dalam perkhidmatan yang sama. Perkhidmatan ini boleh digunakan oleh pengawal yang mengendalikan fungsi log masuk aplikasi.
Melindungi laluan
Kami mungkin mempunyai satu set laluan yang dilindungi dalam permohonan kami. Jika pengguna tidak log masuk dan cuba memasukkan salah satu laluan ini, pengguna harus diarahkan ke halaman log masuk. Ini boleh dilakukan menggunakan blok penyelesaian dalam pilihan penghalaan. Coretan kod berikut menggambarkan pelaksanaan:
<code class="language-javascript">$routeProvider.when("/", { templateUrl: "templates/home.html", controller: "HomeController", resolve: { auth: ["$q", "authenticationSvc", function($q, authenticationSvc) { var userInfo = authenticationSvc.getUserInfo(); if (userInfo) { return $q.when(userInfo); } else { return $q.reject({ authenticated: false }); } }] } });</code>Blok penyelesaian
boleh mengandungi pelbagai blok pernyataan yang mesti mengembalikan objek janji setelah selesai. Hanya untuk menjelaskan, nama yang ditakrifkan di atas tidak ditakrifkan oleh rangka kerja; Anda boleh menukar nama ke mana -mana nama berdasarkan kes penggunaan.
Terdapat beberapa sebab yang boleh menyebabkan penghalaan diluluskan atau ditolak. Bergantung pada senario, anda boleh lulus objek apabila parsing/menolak janji. Kami belum melaksanakan kaedah getLoggedInuser () dalam perkhidmatan. Ini adalah cara mudah untuk mengembalikan objek loggedinuser dari perkhidmatan.
<code class="language-javascript">app.factory("authenticationSvc", function() { var userInfo; function getUserInfo() { return userInfo; } });</code>
Objek yang dihantar oleh janji dalam coretan kod di atas disiarkan melalui $ ROOTSCOPE. Sekiranya laluan telah diselesaikan, acara $ RouteChangeSuccess disiarkan. Walau bagaimanapun, jika penghalaan gagal, acara $ RouteChangeError disiarkan. Kami boleh mendengar acara $ RouteChangeError dan mengalihkan pengguna ke halaman log masuk. Oleh kerana peristiwa berada di tahap $ Rootscope, lebih baik untuk melampirkan pengendali acara di blok larian.
<code class="language-javascript">app.run(["$rootScope", "$location", function($rootScope, $location) { $rootScope.$on("$routeChangeSuccess", function(userInfo) { console.log(userInfo); }); $rootScope.$on("$routeChangeError", function(event, current, previous, eventObj) { if (eventObj.authenticated === false) { $location.path("/login"); } }); }]);</code>
Memproses halaman Refresh
Apabila pengguna mengklik pada butang penyegaran halaman, perkhidmatan kehilangan statusnya. Kami perlu mendapatkan data dari sessionStorage penyemak imbas dan menyerahkannya kepada pembolehubah pembolehubah. Oleh kerana kilang dipanggil hanya sekali, kita boleh menetapkan pembolehubah ini dalam fungsi permulaan seperti yang ditunjukkan di bawah.
<code class="language-javascript">function init() { if ($window.sessionStorage["userInfo"]) { userInfo = JSON.parse($window.sessionStorage["userInfo"]); } } init();</code>
Batal
Apabila pengguna log keluar dari aplikasi, API yang sepadan mesti dipanggil dan token akses dimasukkan ke dalam tajuk permintaan. Selepas pengguna log keluar, kami juga harus membersihkan data dalam sessionStorage. Contoh berikut mengandungi fungsi logout yang mesti ditambah kepada perkhidmatan pengesahan.
<code class="language-javascript">function logout() { var deferred = $q.defer(); $http({ method: "POST", url: logoutUrl, headers: { "access_token": userInfo.accessToken } }).then(function(result) { $window.sessionStorage["userInfo"] = null; userInfo = null; deferred.resolve(result); }, function(error) { deferred.reject(error); }); return deferred.promise; }</code>
Kesimpulan
Kaedah pelaksanaan pengesahan dalam satu aplikasi halaman sangat berbeza daripada aplikasi web tradisional. Oleh kerana kebanyakan kerja dilakukan pada pelanggan, status pengguna juga harus disimpan di suatu tempat pada klien. Adalah penting untuk diingat bahawa Negeri juga mesti dikekalkan dan disahkan di sisi pelayan, kerana penggodam boleh mencuri data yang disimpan pada sistem klien.
Kod sumber dalam artikel ini boleh dimuat turun di GitHub.
Soalan Lazim untuk Melaksanakan Pengesahan dalam Aplikasi Angular
dengan menggunakan cookies pengesahan dalam permintaan HTTP. Dalam sudut, anda boleh menggunakannya dalam modul httpclient. Apabila membuat permintaan, anda boleh menetapkan harta dengan benar. Berikut adalah contoh:
this.http.get(url, { withCredentials: true }).subscribe(...);
Apakah tujuan httpinterceptor dalam sudut?
Bagaimana untuk membuat httpinterceptor tersuai untuk mengendalikan dengan kredensi?
<code class="language-javascript">app.factory("authenticationSvc", function($http, $q, $window) { var userInfo; function login(userName, password) { var deferred = $q.defer(); $http.post("/api/login", { userName: userName, password: password }).then(function(result) { userInfo = { accessToken: result.data.access_token, userName: result.data.userName }; $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); deferred.resolve(userInfo); }, function(error) { deferred.reject(error); }); return deferred.promise; } return { login: login }; });</code>Pemintas ini mengklon setiap permintaan dan menetapkan harta dengan benar.
Kenapa anda menerima ralat CORS semasa menggunakan dengan pemalsuan?
Bagaimana menggunakan harta XMLHTTPREQUEST WithCredentials?
<code class="language-javascript">$routeProvider.when("/", { templateUrl: "templates/home.html", controller: "HomeController", resolve: { auth: ["$q", "authenticationSvc", function($q, authenticationSvc) { var userInfo = authenticationSvc.getUserInfo(); if (userInfo) { return $q.when(userInfo); } else { return $q.reject({ authenticated: false }); } }] } });</code>Ini akan menghantar permintaan GET yang mengandungi kuki ke URL yang ditentukan.
Baki Soalan Lazim berkaitan dengan penggunaan HttpClientModule dan tidak ada kaitan dengan topik teras artikel (pelaksanaan pengesahan dalam sudut), sehingga mereka ditinggalkan di sini. Soalan -soalan ini boleh didapati dengan mudah melalui enjin carian.
Atas ialah kandungan terperinci Melaksanakan pengesahan dalam aplikasi sudut. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!