
PassportJS рдиреЛрдб рдХреЗ рддрд╣рдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИред рдкрд╛рд╕рдкреЛрд░реНрдЯ рднрд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ VKontakte рдФрд░ рдЕрдиреНрдп рдЯреНрд╡рд┐рдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕реВрдЪреА
рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА
рд╣реИ ред рдореИрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП - рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ
рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдирд┐рд░реНрднрд░рддрд╛:
- "рдПрдХреНрд╕рдкреНрд░реЗрд╕": "3.3.7",
- "рдкрд╛рд╕рдкреЛрд░реНрдЯ": "~ 0.1.17",
- "рдкрд╛рд╕рдкреЛрд░реНрдЯ-рд╕реНрдерд╛рдиреАрдп": "~ 0.1.6",
- "рдорд╛рдирдЧреЛ": "~ 3.8.0",
рдореИрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ:
- "рдЬреЗрдб": "*"
- "рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп": "~ 0.1.0"
- "Nconf": "~ 0.6.8"
- "рдЖрд╡рд╢реНрдпрдХрддрд╛-рд╡реГрдХреНрд╖": "~ 0.3.2"
- "рд╡рд┐рдВрд╕реНрдЯрди": "~ 0.7.2"
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
var UserSchema = new mongoose.Schema({ username: { type: String, unique: true, required: true }, password: { type: String, required: true }, }); mongoose.model('user', UserSchema);
рдпрд╣рд╛рдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдирдордХ рдХрд░рдирд╛, рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рднрдЧрд╡рд╛рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рджреВ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ =)ред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рд░рдгрдиреАрддрд┐
рд╕рддреНрдпрд╛рдкрди
рд╣рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд░рдгрдиреАрддрд┐ рдХреЛ рдХрдиреЗрдХреНрдЯ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред
var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function(username, password,done){ User.findOne({ username : username},function(err,user){ return err ? done(err) : user ? password === user.password ? done(null, user) : done(null, false, { message: 'Incorrect password.' }) : done(null, false, { message: 'Incorrect username.' }); }); }));
LocalStrategy 2 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк `LocalStrategy` рдореЗрдВ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд░рдгрдиреАрддрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝реЙрд░реНрдореЗрдЯ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЦреЛрдЬреЗрдЧреАред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рдкрддреНрд░ рдирд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред
рджреВрд╕рд░рд╛ рддрд░реНрдХ - рдорд┐рдбрд▓рд╡реЗрдпрд░ - рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ `рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо`,` рдкрд╛рд╕рдкреЛрд░реНрдЯ` рдФрд░ `рдХрд┐рдпрд╛` рд▓реЗрддрд╛ рд╣реИред рдХрд┐рдпрд╛ рдореЗрдВ, рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╕рддреНрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдмрджрд▓реЗ рдореЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреБрдХреАрдЬрд╝ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкрд╛рд╕рдкреЛрд░реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдФрд░ рд╕рддреНрд░ рд╕реЗ рдЙрд╕рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рддреНрд░ рд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдпрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рд╕рдкреЛрд░реНрдЯ 'passport.serializeUser' () рдФрд░ `passport.deserializeUser '() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err,user){ err ? done(err) : done(null,user); }); });
рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реЗ рдкрд╛рд╕рдкреЛрд░реНрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдЗрд╕реЗ рд╕рдордЭ рд▓рд┐рдпрд╛, рдЕрдм рдЖрдкрдХреЛ рдкрд╛рд╕рдкреЛрд░реНрдЯ рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдПрдХ рд░рд╛рдЙрдЯрд░ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛
рд░рд╛рдЙрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдмрд╛рдВрдзреЗрдВ:
рдЕрдм рд╕реНрд╡рдпрдВ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБ:
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬрд╛рдБрдЪ
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕рддреНрдпрд╛рдкрди req.isAuthenticated () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛ред
exports.mustAuthenticatedMw = function (req, res, next){ req.isAuthenticated() ? next() : res.redirect('/'); };
рдФрд░ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
App.all('private', mustAuthenticatedMw); App.all('private/*', mustAuthenticatedMw);
рдПрдЪрдЯреАрдПрдордПрд▓
рдпрд╣ рдкрдВрдЬреАрдХрд░рдг рдлреЙрд░реНрдо, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рд▓реЙрдЧрдЖрдЙрдЯ рдмрдЯрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рд░рдЬрд┐рд╕реНрдЯрд░:
h4 Register your account form(action='/register' method='post') fieldset label(for='email') Email input(type='email' name='email' placeholder='Your Email') label(for='password') Password input(type='password' name='password' placeholder='Your Password') button(type='Register')
рд▓реЙрдЧ рдЗрди
h4 Login to your account form(action='/login' method='post') fieldset label(for='email') Email input(type='email' name='email' placeholder='Your Email') label(for='password') Password input(type='password' name='password' placeholder='Your Password') button(type='Login')
рд▓реЙрдЧрдЖрдЙрдЯ
a(href='/logout') logout
рдареАрдХ рд╣реИ, рдЖрдк рдХрд╛рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд╕реИрдХрдбрд╝реЛрдВ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЖрдк
рдЧрд┐рдЯрд╣рдм рдкрд░ рднрдВрдбрд╛рд░ рдХрд╛ рдХрд╛рдВрдЯрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред