Artikel ini meneroka pengesahan pengguna dalam aplikasi stack min, menggunakan seni bina yang sama: aplikasi satu halaman sudut berinteraksi dengan Node.js, Express.js, dan API REST berasaskan MongoDB. Kami akan merangkumi aspek utama pengurusan pengguna yang selamat.
Cabaran Pengesahan Teras:
Proses memerlukan menangani beberapa titik penting:
Sebelum menyelidiki kod, mari kita periksa aliran pengesahan peringkat tinggi:
crypto
Contoh struktur aplikasi:
Kod Lengkap boleh didapati di GitHub. Prasyarat termasuk node.js, mongodb, dan cli sudut.
Permohonan sudut:
aplikasi sudut mempunyai empat halaman asas:
rumah
REST API (node.js, express.js, mongoDB):
API termasuk tiga laluan teras: skema mongoDB (mongoose): mentakrifkan Hashing dan Salting Kata Laluan:
dan jwt generasi:
menggunakan modul konfigurasi pasport.js:
mentakrifkan strategi tempatan: API Endpoints and Authentication:
mentakrifkan laluan API, termasuk middleware untuk pengesahan JWT menggunakan Perkhidmatan Pengesahan Angular:
) menguruskan penyimpanan JWT (LocalStorage), pengambilan semula, penghapusan, panggilan API, pemeriksaan status log masuk, dan pengekstrakan butiran pengguna dari JWT. perlindungan laluan sudut:
) melindungi laluan Kesimpulan:
Soalan-soalan yang sering ditanya (Soalan Lazim): (Soalan Lazim Asal sudah cukup komprehensif dan ditulis dengan baik. Saya tidak akan mengulanginya di sini, kerana menambah mereka akan membuat respons ini terlalu lama.)
/api/register
(pos): Pendaftaran pengguna. /api/login
(pos): log masuk pengguna. /api/profile/:USERID
(mendapatkan): mengambil butiran profil pengguna (dilindungi). /api/models/users.js
, email
, name
, dan hash
medan. Bidang salt
adalah unik. email
var userSchema = new mongoose.Schema({
email: { type: String, unique: true, required: true },
name: { type: String, required: true },
hash: String,
salt: String
});
setPassword
, memanfaatkan modul Node.js validPassword
, mengendalikan pengurusan kata laluan yang selamat tanpa menyimpan kata laluan secara langsung. crypto
userSchema.methods.setPassword = function(password) {
this.salt = crypto.randomBytes(16).toString('hex');
this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha512').toString('hex');
};
userSchema.methods.validPassword = function(password) {
var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha512').toString('hex');
return this.hash === hash;
};
generateJwt
untuk membuat JWTS. jsonwebtoken
ingat untuk menyimpan rahsia anda dengan selamat, idealnya sebagai pemboleh ubah persekitaran, tidak langsung dalam kod.
userSchema.methods.generateJwt = function() {
var expiry = new Date();
expiry.setDate(expiry.getDate() + 7);
return jwt.sign({
_id: this._id,
email: this.email,
name: this.name,
exp: parseInt(expiry.getTime() / 1000),
}, "MY_SECRET");
};
/api/config/passport.js
passport.use(new LocalStrategy({ usernameField: 'email' }, function(username, password, done) {
User.findOne({ email: username }, function(err, user) {
// ... (error handling and password verification logic) ...
});
}));
/api/routes/index.js
: express-jwt
var auth = jwt({ secret: 'MY_SECRET', userProperty: 'payload' });
router.get('/profile', auth, ctrlProfile.profileRead);
authentication.service.ts
auth-guard.service.ts
, memastikan hanya pengguna log masuk boleh mengaksesnya. /profile
Atas ialah kandungan terperinci Pengesahan Pengguna dengan Stack Mean. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!