рдбрд░реНрдмреА рд╕реАрдЦрдирд╛ 0.6 рдЙрджрд╛рд╣рд░рдг # 3



рдпрд╣ рдкрд╛рда, рдбрд░реНрдмреАрдЬ рдкрд░ рдкрд╛рдареЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдлреНрд░реЗрдорд╡рд░реНрдХред рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкрд╛рда рдкрдврд╝реЗрдВ ( рдкрд╣рд▓рд╛ , рджреВрд╕рд░рд╛ )ред



рдЗрд╕ рдкрд╛рда рдореЗрдВ рджреЛ рднрд╛рдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ: рдкрд╣рд▓рд╛ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХрд╛ рдЕрд╡рд▓реЛрдХрди рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ derby-auth



рдореЙрдбреНрдпреВрд▓ ( passportjs



рдкрд░ рд░реИрдкрд░, passportjs



) рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг / рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рднреА рд╣реИред



рднрд╛рдЧ 1 - рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рд░реНрд╡рд░ рдХреЛрдб



рдЯреНрд░реЗрдирд┐рдВрдЧ


рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП derby-starter



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╣рдорд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░, рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдорд╛рдирдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕рдЬреЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╡рд╣рд╛рдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЬрд┐рд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдорд┐рдбрд╡реНрд▓рд╡реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╣рдо derby-starter



рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред



рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ expressjs



рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдпрд╛ nodejs



рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ nodejs



рдЗрд▓рд┐рдпрд╛ рдХрд╛рдВрдЯреЛрд░ рдХреЗ рдЕрджреНрднреБрдд рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ nodejs



ред



рдЖрдзрд╛рд░ рдЖрд╡реЗрджрди


рдЖрдЬ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдореЗрд░реА derby-boilerplate



рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ derby-boilerplate



ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдиреНрдпреВрдирддрдо рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдм derby-starter



, рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣реА (рдЕрдВрддрд┐рдо 4 рд╡реЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ redis



рдХрд╛ рдЙрдкрдпреЛрдЧ redis



рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) - рдЕрдм рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИ)ред рдЖрджреЗрд╢ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ:



 git clone https://github.com/derbyparty/derby-boilerplate.git
      
      







рдЪрд▓реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдореБрдХрд╛рдмрд▓рд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд:



 src/ app/ server/ styles/ views/ index.js
      
      





app



рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдорд╛рд░рд╛ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрдЧрд╛ред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рд╕рд░реНрд╡рд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ derby-starter



рдХрд╛ "рдПрдирд╛рд▓реЙрдЧ" рд╣реЛрдЧрд╛ (рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ derby-starter



рд▓рд┐рдпрд╛ derby-starter



, рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХрд┐рдпрд╛), рд╣рдо рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред



рдХреНрд░рдорд╢рдГ styles



рдФрд░ views



рдлрд╝реЛрд▓реНрдбрд░реНрд╕, рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВред Index.js рдлрд╝рд╛рдЗрд▓ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдереА, рдЗрд╕рдХреЗ рд╕рдорд╛рди рд╣реИ - рдХреБрдЫ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛ рдкреВрд░реА рдмрд╛рдд рд╢реБрд░реВ рдХрд░рддреА рд╣реИрдВред



рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рд░реНрд╡рд░ рд╣рд┐рд╕реНрд╕рд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рдбрд░реНрдмреА рдПрдХ expressjs



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, express-middleware



рдХреНрдпрд╛ рд╣реИ, рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╕рддреНрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд░рд╛рдЙрдЯрд┐рдВрдЧ - рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЬреНрдЮрд╛рди рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛ред



рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:

 error/ index.js server.js
      
      





рдореИрдВрдиреЗ рддреНрд░реБрдЯрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдбрд╛рд▓рд╛, рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд░рд╣реВрдВрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ expressjs-middlware



, рдЬреЛ рддрдм рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП url



рд▓рд┐рдП рдХреЛрдИ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реБрдИ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



server.js



рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп express



(рдЬреЛ рд╕рд░реНрд╡рд░ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред server.js



рдлрд╝рд╛рдЗрд▓) рд╣реИ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ рд╕рд░реНрд╡рд░ server.js



:

рд╕реНрд░реЛрдд рдХреЛрдб (рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдбрд░реНрдмреА-рд╕реНрдЯрд╛рд░реНрдЯрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд)
 var derby = require('derby'); exports.run = function (app, options, cb) { options = options || {}; var port = options.port || process.env.PORT || 3000; derby.run(createServer); function createServer() { if (typeof app === 'string') app = require(app); var expressApp = require('./server.js').setup(app, options); var server = require('http').createServer(expressApp); server.listen(port, function (err) { console.log('%d listening. Go to: http://localhost:%d/', process.pid, port); cb && cb(err); }); } }
      
      







рдЗрд╕рдХреЗ рдмрд╛рдж рдордЬреЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рдЖрддрд╛ рд╣реИ, рдПрдХреНрд╕рдкреНрд░реЗрд╕рдЬ рдХреА рд╕реНрдерд╛рдкрдирд╛, derby



рд╕рд╛рдеред рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕рдордЭрдирд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИ рдХрд┐ рдбрд░реНрдмреА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдореИрдВ 4 рд╡реЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдореЗрдВ 3 рдЬреА рд╕реЗ рдХрдИ рдЕрдВрддрд░ рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЕрдм express



рд╡рд┐рддрд░рдг рд╕реЗ рдЧрд╛рдпрдм рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



рддреЛ, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдмрд┐рдирд╛ рдбрд░реНрдмреА рдХреЗ рдХреБрдЫ рджрд┐рдЦреЗрдЧреА:



Server.js рдХреЛрдб, рдЕрдЧрд░ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереЗ:
 var express = require('express'); //  4-   middleware     //        var session = require('express-session'); //      var MongoStore = require('connect-mongo')(session); //   -      , //    var midError = require('./error'); var MongoClient = require('mongodb').MongoClient; exports.setup = function setup(app, options) { var mongoUrl = process.env.MONGO_URL || process.env.MONGOHQ_URL || 'mongodb://localhost:27017/derby-app'; //     MongoClient.connect(mongoUrl); var expressApp = express() if (options && options.static) { expressApp.use(require('serve-static')(options.static)); } expressApp.use(require('cookie-parser')()); expressApp.use(session({ secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE', store: new MongoStore({url: mongoUrl}) })); //         -      //    -  404  expressApp.all('*', function(req, res, next) { next('404: ' + req.url); }); //   expressApp.use(midError()); return expressApp; }
      
      







рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЙрдбреНрдпреВрд▓ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдлрд┐рд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдЖрддреА рд╣реИ - рдПрдХреНрд╕рдкреНрд░реЗрд╕ middleware



(рдПрдХреНрд╕рдкреНрд░реЗрд╕рдРрдк.рдпреВрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ expressApp.use



ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ middlware



рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ middleware



рдпрд╛ рддреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реИ (рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рд╢реЗрд╖ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рдпрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдХреБрдЫ рдордзреНрдпрд╡рд░реНрддреА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, cookies



рдкрд╛рд░реНрд╕ cookies



, cookies



рджреНрд╡рд╛рд░рд╛ рд╕рддреНрд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВ, рдЖрджрд┐) рдФрд░ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдирд┐рдпрдВрддреНрд░рдгред рдЖрдЧреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдиреАрдЪреЗред middlware



рдХрдиреЗрдХреНрд╢рди рдХреНрд░рдо рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдпрд╣ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдФрд░ рдпрд╣рд╛рдБ рдбрд░реНрдмреА рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдбрд░реНрдмреА рдХреЗ рд╕рд╛рде рдХрдореЗрдВрдЯ рдХрд┐рдпрд╛ рд╣реБрдЖ server.js рдХреЛрдб

 // 4-  var express = require('express'); //  4-   middleware     //        var session = require('express-session'); //      var MongoStore = require('connect-mongo')(session); //   -      , //    var midError = require('./error'); var derby = require('derby'); // BrowserChannel -  socket.io   - ,  // ,        // liveDbMongo -     -     var racerBrowserChannel = require('racer-browserchannel'); var liveDbMongo = require('livedb-mongo'); //     browserify derby.use(require('racer-bundle')); exports.setup = function setup(app, options) { var mongoUrl = process.env.MONGO_URL || process.env.MONGOHQ_URL || 'mongodb://localhost:27017/derby-app'; //     (      redis) var store = derby.createStore({ db: liveDbMongo(mongoUrl + '?auto_reconnect', {safe: true}) }); var expressApp = express() //     "" // (..     /derby/...) expressApp.use(app.scripts(store)); if (options && options.static) { expressApp.use(require('serve-static')(options.static)); } //       browserchannel, //   middleware,    // (browserchannel   longpooling - ..   //    /channel) expressApp.use(racerBrowserChannel(store)); //  req   getModel,   // express-       // . createUserId expressApp.use(store.modelMiddleware()); expressApp.use(require('cookie-parser')()); expressApp.use(session({ secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE', store: new MongoStore({url: mongoUrl}) })); expressApp.use(createUserId); //    -, //   ,      //   expressApp.use(app.router()); //         -     //  //    -  404  expressApp.all('*', function(req, res, next) { next('404: ' + req.url); }); //   expressApp.use(midError()); return expressApp; } //  id-     , //    id  -   function createUserId(req, res, next) { var model = req.getModel(); var userId = req.session.userId; if (!userId) userId = req.session.userId = model.id(); model.set('_session.userId', userId); next(); }
      
      







рдЗрд╕реЗ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдирд┐рдХрд╛рд▓реЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ browserify



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рддрдерд╛рдХрдерд┐рдд "рдмрдВрдбрд▓" рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдПрдХ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдореЗрдВ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рднреА javascript



рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ (cc рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) ред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рд╕рд╛рдЗрдЯ рдХреЗ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде - рдмрдВрдбрд▓ рдХреЛ рддреБрд░рдВрдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛ред рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╕реНрддреБрдд рдкреГрд╖реНрда рдФрд░ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдЧрддрд┐ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреГрд╖реНрда рд╕реНрд╡рдпрдВ "рдмрдВрдбрд▓" рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ - рдкрддреЗ рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ "/ derby /: bandle-name"ред



рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ рдХрд┐ рдХрдИ "рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдПрдХ рдбрд░реНрдмреА рдХреЗ рдПрдХ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдмрдВрдбрд▓ рд╣реЛрдЧрд╛ред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╛рдЗрдЯ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рднреА рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рди рдХрд░реЗрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:



  expressApp.use(clientApp.scripts(store)); expressApp.use(adminApp.scripts(store));
      
      







рд╡рд╣реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдорд╛рд░реНрдЧреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 2 "рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:



  expressApp.use(app.router());
      
      







рджреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯрд░реНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛:



  expressApp.use(clientApp.router()); expressApp.use(adminApp.router());
      
      







рдареАрдХ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ "рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ expressjs



рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА RESTFull рдПрдкреАрдЖрдИ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рд▓рд╛рдареА рдФрд░ рдпреБрд╡рд╛ рдорд╣рд┐рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рдеред рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбрд░реНрдмреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд░рд╛рдЙрдЯрд░, рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рдмрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВред



рдЕрдЧрд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ browserchannel



рдХрд╛ рдХрдиреЗрдХреНрд╢рди рд╣реИ - рдпрд╣ Google socket.io



рдмрд░рд╛рдмрд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд╣рди рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ред рд╣реБрдб рдХреЗ рддрд╣рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░рдЪреИрди рдХреЛ рдмрдВрдбрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдз (рдпрд╣ рд▓реЙрдиреНрдЧрдкрд▓рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ - рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ /channel



)



рд╣рд╛рдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рдореВрд▓ рдбрд░реНрдмреА рд╕реЗрдЯрдЕрдк рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, redis



рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдбрд░реНрдмреА рдЕрдкрдбреЗрдЯ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдм, redis



рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЕрдЧрд░ рд╣рдо рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЕрд░реНрдерд╛рдд, рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рде рдХрдИ рдбрд░реНрдмреА рд╕рд░реНрд╡рд░ рдЪрд▓рд╛рдПрдВ)ред



рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдордп рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреБрдЫ рднреА рд▓рдЪреАрд▓рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ expressjs-middlware



, рдбрд░реНрдмреА рдкреНрд▓рдЧрдЗрдиреНрд╕, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╣реИрдВрдбрд▓рд░ - рдХреБрдЫ рднреА рд╣реЛред рдпрд╣ рд╕рдм рдЪреБрдкрдЪрд╛рдк рдПрдХ рд╕рд╛рде рд░рд╣реЗрдВрдЧреЗред



рддреЛ, рдареАрдХ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдореБрджреНрджреЗ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ - рд╕рддреНрд░ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдбрд░реНрдмреА рд╕рддреНрд░ рдХрд╛рдлреА express



рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ express



рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╕рдм рдХреБрдЫ рд╢рд╛рд╕реНрддреНрд░реАрдп рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ: рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рд╕рддреНрд░ sessions



рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ mongodb



рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдпрджрд┐ рдЖрдк createUserId



рдлрд╝рдВрдХреНрд╢рди рдХреЛ createUserId



рд╣реИрдВ:



 function createUserId(req, res, next) { var model = req.getModel(); var userId = req.session.userId; if (!userId) userId = req.session.userId = model.id(); model.set('_session.userId', userId); next(); }
      
      





рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рд╕рддреНрд░ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рддреЛ рдЖрдИрдбреА рдЕрдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ ( model.id()



) рдФрд░ _session.userId



рдкрде рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдбреЗрдЯрд╛ рдХреНрд░рдордмрджреНрдз рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдФрд░ рд╕рддреНрд░ рдореЗрдВ рд╣реАред ред



рдХрдИ рдХреНрд╡реЗрд░реА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:



  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╕рд╛рдЗрдЯ рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ - рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдирдпрд╛ рдХреБрдХреА рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдПрдХ рдирдпрд╛ рд╕рддреНрд░ (рдПрдХ рдирдпрд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде) - рдореБрдЦреНрдп рдкреГрд╖реНрда рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдореЙрдбрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдкрде '_session.userId' рдкрд░ рдЬрд╛рдПрдБ - рд╣рдо рдЕрдкрдиреА рдирд╡рдЧрдард┐рдд рдЖрдИрдбреА рджреЗрдЦреЗрдВрдЧреЗред рдЕрдм рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдкрдиреНрдиреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реИрдВ (рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛) - рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдЕрдкрдирд╛ рдЖрдИрдбреА рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдХреБрдХреА рдФрд░ рд╕рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рди рд╕рдХреЗрдВрдЧреЗред
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдмрд╛рдж рдкрдВрдЬреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ред рдХреБрдХреА рдХреЛ рдЙрд╕рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЙрд╕реЗ рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред
  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреВрд╕рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ - рдЪрд░рдг 1 рдореЗрдВ рдЬреИрд╕рд╛ рд╣реИ


рдорд╛рди рд▓реАрдЬрд┐рдП, рд╣рдо рдкрдВрдЬреАрдХрд░рдг / рдкреНрд░рд╛рдзрд┐рдХрд░рдг (рд╕рд░реНрд╡рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ - рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрдирд╛рдПрдВрдЧреЗ, рд╣рдореЗрдВ рдЖрдИрдбреА рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред



рдЬрдм рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА, рдлрд┐рд░ рд╡рд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдЧрд╛ - рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рднреА рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдлрд┐рд░ рд╕рд░реНрд╡рд░ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреМрди рд╣реИ рдФрд░ рд╕рддреНрд░ рдореЗрдВ рдФрд░ _session.userId



рдореЗрдВ userId рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред



рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣рдо рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдИрдореЗрд▓, рдкрд╛рд╕рд╡рд░реНрдб, рд╢рд╛рдпрдж рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреБрдЫ рдЖрдБрдХрдбрд╝реЗред рдпрджрд┐ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдкрд░ рд╕рд╛рдорд╛рдЬрд┐рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг (рдкрдВрдЬреАрдХрд░рдг) рд╣реЛрдЧрд╛ред рдиреЗрдЯрд╡рд░реНрдХ, рдлрд┐рд░ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдХреБрдВрдЬреА рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ - рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред



рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдХреЛрдИ рднреА рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХреЗред рдЕрдм рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рддрдерд╛рдХрдерд┐рдд рдЕрдиреБрдорд╛рди рдбрд░реНрдмреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП (рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдкреВрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП), рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ - рдпрд╣ рдЕрд╕рдВрднрд╡ рдерд╛, рдФрд░ рд╣рдо рдЬрд┐рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ derby-auth



рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЕрднреА рддрдХ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдкрд╣рд▓рд╛ auths



рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ (рдХреЗрд╡рд▓ рдирд┐рдЬреА рдбреЗрдЯрд╛ рдпрд╣рд╛рдВ рд╣реИ), рджреВрд╕рд░рд╛ users



рдпрд╣рд╛рдВ рдЦреБрд▓реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЗрдЯрд╛ рд╣реИрдВред рддреЛ derby-auth







рднрд╛рдЧ 2 - рдПрдХ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг (рдбрд░реНрдмреА-рдСрд╕реНрдЯреНрд░рд▓ рдореЙрдбреНрдпреВрд▓)



рдбрд░реНрдмреА-рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛


рдлрд┐рд▓рд╣рд╛рд▓ 2 рдкреИрдХреЗрдЬ рд╣реИрдВ - рдбрд░реНрдмреА рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдзрд┐рдХрд░рдгред рдпреЗ derby-auth



рдФрд░ derby-passport



ред рд╡реЗ рджреЛрдиреЛрдВ passportjs



рдкрд░ рд░реИрдкрд░ рд╣реИрдВ, (рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдФрд░ рдХрд╛рдВрдЯрд╛)ред рджреЛрдиреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдбрд░реНрдмреА рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ (рдореИрдВ рдЕрд▓реНрдлрд╛ рдореЗрдВ 6 рд╡реЗрдВ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ), рдЕрднреА рддрдХ 6 рдХреЗ рддрд╣рдд рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ 6-рдХреЗ рдкрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯреЛрдВ рдореЗрдВ derby-auth



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ (рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ) рдХреЗрд╡рд▓ html рдлреЙрд░реНрдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╡реЗ рд╡реИрд╕реЗ рднреА рдХрд╕реНрдЯрдо рд╣реИрдВ)ред



derby-auth



рдкрдХреНрд╖ рдореЗрдВ рдореЗрд░реА рдкрд╕рдВрдж рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред



рдПрдХ рдФрд░ рд╕реАрдорд╛ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХреА рд╣реИ рдХрд┐ рдЗрди рджреЛрдиреЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЗрдЯрд╛ рдХреЛ users



рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдирд┐рдЬреА рд▓реЛрдЧреЛрдВ рдореЗрдВред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, "рдЕрдиреБрдорд╛рдиреЛрдВ" рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд░реНрдмреА рдореЗрдВ рдПрдХ рдЕрд╡рд╕рд░ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ-рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдпреЗ рдореЙрдбреНрдпреВрд▓ рдбрд░реНрдмреА рдХреЗ 6 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдмрдВрдз рд╣рдЯ рдЬрд╛рдПрдЧрд╛ред



рдЕрджреНрдпрддрди

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж, рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдорд╛рдЦрд╛рд╡реЗ (@vmakhaev) рдиреЗ рдбрд░реНрдмреА- рдСрд░реНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рднрдпрд╛рдирдХ рдбрд░реНрдмреА-рд▓реЙрдЧрд┐рди рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ 0.6 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣реИ, рдЕрдиреБрдорд╛рдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ, рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ, рдкрд╛рд╕рд╡рд░реНрдб рдмрджрд▓рдиреЗ - рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдШрдЯрдХ рд╣реИрдВред



рд╡реИрд╕реЗ, рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдордд рднреВрд▓рдирд╛, рдХрдо рд╕реЗ рдХрдо рдЧреАрдердм рдкрд░ рддрд╛рд░рд╛рдВрдХрди рдХреЗ рд╕рд╛рдеред рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдХрд┐рдпрд╛ред



рдкрд╛рд╕рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛




PassportJS



node.js



рддрд╣рдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП middleware



рдпрд╣ рдПрдХ рдЕрдореВрд░реНрдд рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рдзрд┐рдХрд░рдг рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ Oauth, Oauth 2, рдЖрджрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рдзрд┐рдХрд░рдгред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд░рдгрдиреАрддрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ LocalStrategy



("рд╕реНрдерд╛рдиреАрдп рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд░рдгрдиреАрддрд┐") GithubStrategy



рд╣реИ, рдФрд░ GithubStrategy



рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг GithubStrategy



ред рдкреНрд░рддреНрдпреЗрдХ рд░рдгрдиреАрддрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рдПрдХ рдиреЛрдб рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЬреЗрдПрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var GithubStrategy = require('passport-github').Strategy;
      
      







рдпрд╣ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдЬрд┐рдХ рдореЗрдВ рдЗрд╕реЗ (рдЖрд╡реЗрджрди) рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдпрд╣ appId



(рдпрд╛ clientId



рдЗрд╕ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдПрдХ рдЕрдиреВрдард╛ рдЖрдИрдбреА- clientId



рд╣реИ) рдФрд░ рдЧреБрдкреНрдд (рдХреЛрдИ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдЬрд┐рд╕реЗ рдХреЛрдИ рдХрд┐рд╕реА рдХреЛ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХреЗред рд╣рдо рд╣) рд╣реИрдВред рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп, рддрдерд╛рдХрдерд┐рдд redirectURL



рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ - рдЕрд░реНрдерд╛рддреН, рд╡рд╣ рдпреВрдЖрд░рдПрд▓ рдкрддрд╛ рдЬрд╣рд╛рдВ рд╕рд╛рдорд╛рдЬрд┐рдХ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рд╣реЛрдЧрд╛: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ : 3000 / рдСрд░реНрдЯрд┐рдХрд▓ / рдЬреАрдердм / рдХреЙрд▓рдмреИрдХ - рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рднреАред



рдирдореВрдирд╛ рдЖрд╡реЗрджрди рдореЗрдВ, рдореИрдВ github



рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ (рдЕрдиреНрдп рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред





рдХрд┐рд╕реА рдХреЛ рдореЗрд░рд╛ рд░рд╛рдЬ рдордд рдмрддрд╛рдирд╛ред



рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рд╕реЗ рдбрд░реНрдмреА-рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ


рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕реАрдзреЗ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ derby-auth



рдХреЛ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд┐рдЫрд▓реЗ derby



рд▓рд┐рдП рдПрдХ рдорд╛рд╕реНрдЯрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:



npm рд╕реНрдерд╛рдкрд┐рдд git: //github.com/cray0000/derby-auth#0.5 -S



Derby-auth



рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ passport



рдФрд░ passport-local



рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ passport-github



рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ:



 npm install passport-github -S
      
      







рдЕрдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬрд╛рдПрдВред рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдм рдХреБрдЫ рдХрд░реЗрдВрдЧреЗ - https://github.com/lefnire/derby-auth/tree/0.5 ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдиреЗрдХреНрд╢рди рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╣рдореЗрдВ src / server / server.js рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рдЪрд░рдг 1


рд╣рдо рдЦреБрдж рд╣реА рдбрд░реНрдмреА-рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)



  //  derby-auth var auth = require('derby-auth'); var strategies = { github: { strategy: require("passport-github").Strategy, conf: { clientID: 'eeb00e8fa12f5119e5e9', clientSecret: '61631bdef37fce808334c83f1336320846647115' } } }
      
      





рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдЕрдзрд┐рдХ рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реЛрддреАрдВ, рддреЛ рд╡реЗ рд╕рднреА рдпрд╣рд╛рдБ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрддреАрдВ:



рдЪрд░рдг 2


рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд░реЗрдВ:



  var options = { passport: { failureRedirect: '/login', successRedirect: '/' }, site: { domain: 'http://localhost:3000', name: 'Derby-auth example', email: 'admin@mysite.com' }, smtp: { service: 'Gmail', user: 'zag2art@gmail.com', pass: 'blahblahblah' } }
      
      





рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдирд╛рдореЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: failureRedirect



, successRedirect



- url рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрд░рдорд╢рдГ successRedirect



/ рд╕рдлрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд░рдгрдиреАрддрд┐ рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрд╡реЗрджрди рджрд░реНрдЬ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рднрд░реЗ рдЧрдП рдереЗ)ред "рдкрд╛рд╕рд╡рд░реНрдб рднреВрд▓ рдЬрд╛рдиреЗ - рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдореБрдЭреЗ рд╕рд╛рдмреБрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рднреЗрдЬрдиреЗ" рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



рдЪрд░рдг 3


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрдВрдбрд╛рд░рдг



  auth.store(store, false, strategies);
      
      







рдЗрд╕ рдХрджрдо рдкрд░, derby-auth



рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрд░реНрдбрд░реНрд╕ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╡рд╣ рдХреЗрд╡рд▓ рдЕрдкрдирд╛ рдЦрд╛рддрд╛ рджреЗрдЦреЗрдЧрд╛ред рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИред



рдЪрд░рдг 4


рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рддреНрд░реЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ рдФрд░ body-parser



(рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ - рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ npm i body-parser -S



рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ):



  expressApp.use(require('cookie-parser')()); expressApp.use(session({ secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE', store: new MongoStore({url: mongoUrl}) })); expressApp.use(require('body-parser')()) //  method-override , //    ,  PUT   //   expressApp.use(require('method-override')())
      
      







рдЦреИрд░, рдЖрдЦрд┐рд░реА derby-auth middeware



рдмрд╛рдд - рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣рд╛рдБ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЕрдЧрд▓реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ :



 expressApp.use(auth.middleware(strategies, options));
      
      







рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдХ рдпрд╣рд╛рдВ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВ рдЬреЛ expressjs



рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖ рдпреВрдЖрд░рдПрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИред рддреЛ рдпрд╣ рд╣реИ - рдпрд╣рд╛рдБ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ:

рд░реЛрде рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рднрд╛рдЧреНрдп
/ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВ post



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
/ рд░рдЬрд┐рд╕реНрдЯрд░ post



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдИрдореЗрд▓, рдкрд╛рд╕рд╡рд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
/ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ /: рдкреНрд░рджрд╛рддрд╛ get



рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВ рдпрд╣рд╛рдБ рд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдорд╛рдЬрд┐рдХ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдиреЗрдЯрд╡рд░реНрдХред

рдЙрджрд╛рд╣рд░рдг рдкрде: / рд╕реНрдерд┐рддрд┐ / github

/auth/:provider/callback get



. тАФ derby-auth failureRedirect successRedirect url.

: /auth/github/callback тАФ url , . .

/logout get



┬л┬╗ '/'
/password-reset post



рдИрдореЗрд▓ email ( AJAX)
/password-change post



uid, oldPassword, newPassword ( AJAX)




рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдПрдХ рдФрд░ (рд╡реИрдХрд▓реНрдкрд┐рдХ) рдЪрд░рдг рд╣реИ - рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдШрдЯрдХреЛрдВ (HTML рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг / рдкрдВрдЬреАрдХрд░рдг рдкреНрд░рдкрддреНрд░реЛрдВ рдХреА рд╢реИрд▓реА, рдЖрджрд┐), рд▓реЗрдХрд┐рди рдпреЗ рдШрдЯрдХ рд╡реНрдпреБрддреНрдкрдиреНрди 0.5 рдХреЗ рддрд╣рдд рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрднреА рддрдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдХрд╛рдо рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдкреЛрдВ рдХреЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдореЙрдбрд▓ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦреЗрдВрдЧреЗ




Derby-auth



рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЕрдкрдиреА рдЖрдИрдбреА, рд▓реЙрдЧ рдЗрди рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реИ:

рдЪрд▓реЛ рд╡рд┐рд╡рд░рдг
_session.loggedIn рдмреВрд▓рд┐рдпрди рдЪрд░ - рдЕрдзрд┐рдХреГрдд / рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ
_session.userId рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА
_session.flash.error рддрд╛рд░ рдХреА рд╕рд░рдгреА - рд╕рд╣рд╛рдпрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ (рдкреНрд░рд╛рдзрд┐рдХрд░рдг / рдкрдВрдЬреАрдХрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░)
рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ред {userId} .Local рд╕реНрдерд╛рдиреАрдп рдкрдВрдЬреАрдХрд░рдг рдЬрд╛рдирдХрд╛рд░реА
рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ред {userId}ред {рдкреНрд░рджрд╛рддрд╛} рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд╛рдорд╛рдЬрд┐рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХрд░рдг рдбреЗрдЯрд╛ред рдиреЗрдЯ


рдпрд╣ рд╕рдм рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рджреГрд╢реНрдп рдШрдЯрдХ derby-auth



рдбрд░реНрдмреА рдХреЗ 6 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрд╡реЗрджрди рджреЛ рдЦрд╛рддреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрдирдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬреБрдбрд╝реЗрдВрдЧреЗ bootstrap



, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо src / app / index.js рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗ

 app.use(require('d-bootstrap'));
      
      





рдкреВрд░реНрд╡ рдХрд┐рдпрд╛

 npm i d-bootstrap -S
      
      





рддреАрд╕рд░рд╛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред



рдЖрд╡реЗрджрди рдореЗрдВ, рдореИрдВ 2 рдкреЗрдЬ рдмрдирд╛рдКрдВрдЧрд╛: рдкрд╣рд▓рд╛, рдкрддреЗ рдХреЗ рддрд╣рдд "/" рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде, рддрд╛рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓, рджреВрд╕рд░рд╛, '' / рд▓реЙрдЧрд┐рди '' рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрдВрдЬреАрдХрд░рдг рдлрд╛рд░реНрдореЗрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ, рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рджреЛ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдЦреАрдВрдЪреВрдВрдЧрд╛ auths



ред



рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд░реНрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ src/app/index.js



рдХреЛ рд╡рд┐рд╢реЗрд╖ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рд╣реИ рд╡рд╣ рд╣реИ "*" рдирд┐рдпрдВрддреНрд░рдХ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдмрд╛рдд рд╣реИ:



 var derby = require('derby'); var app = module.exports = derby.createApp('auth', __filename); global.app = app; app.use(require('d-bootstrap')); app.loadViews (__dirname+'/../../views'); app.loadStyles(__dirname+'/../../styles'); app.get('*', function(page, model, params, next){ var user = 'auths.' + model.get('_session.userId'); model.subscribe(user, function(){ model.ref('_page.user', user); next(); }); }); app.get('/', function (page, model){ page.render('home'); }); app.get('/login', function (page, model){ page.render('login'); });
      
      







рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдЗрд╕реЗ layout



рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдореЗрдиреВ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ index.html



, home.html



рдФрд░ login.html



рдХреНрд░рдорд╢рдГ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдПрдХ рдкреГрд╖реНрда рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ (рд▓реЙрдЧ рдЗрди / рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЬреАрдердм рдЦрд╛рддрд╛ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг / рдкрдВрдЬреАрдХрд░рдг рд╡рд╛рд▓рд╛ рдкреГрд╖реНрдаред



рддреЛ index.html
 <import: src="./home"> <import: src="./login"> <Title:> Derby-auth example <Body:> <div class="navbar navbar-inverse" role="navigation"> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="/">Derby-auth Example</a> </div> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <view name="nav-link" href="/"></view> <view name="nav-link" href="/login"></view> </ul> </div> </div> </div> {{if _session.flash.error}} <div class="container"> {{each _session.flash.error as #error}} <div class="alert alert-warning">{{#error}}</div> {{/}} </div> {{/}} <view name="{{$render.ns}}"></view> <nav-link: element="nav-link"> <li class="{{if $render.url === @href}}active{{/}}"> <a href="{{@href}}">{{@content}}</a> </li>
      
      









рдпрд╣ рдореЗрдиреВ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдпрдХ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рд╕рддрд░реНрдХрддрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдпрд╣рд╛рдВ рд╕рд╡рд╛рд▓ рдЙрдард╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ:



 <view name="{{$render.ns}}"></view>
      
      







рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рдмрдЬрд╛рдп, рдбрд░реНрдмреА home.html



рдпрд╛ рддреЛ рдХрдВрдЯреЗрдВрдЯ рдбрд╛рд▓реЗрдЧреА рдпрд╛ login.html



, рдЬреЛ рд╣рдордиреЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░: page.render('home')



рдпрд╛ page.render('login')







рд╕рдкреЛрд░реНрдЯрд┐рдВрдЧ рдкреЗрдЬ рдХреЗ рд╕рд╛рде home.html



:



 <index:> <div class="container"> <h1>:</h1> {{if _session.loggedIn}} <p>   </p> <h2> :</h2> {{if _page.user.local}} <p> : <b>{{_page.user.local.username}}</b></p> {{else}} <p> </p> {{/}} <h2>GitHub:</h2> {{if _page.user.github}} <p> : <b>{{_page.user.github.username}}</b></p> {{else}} <p> </p> {{/}} <a class="btn btn-danger" href="/logout"></a> {{else}} <p>    </p>  <a href="/login">/</a> {{/}} </div>
      
      







"рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ" рдмрдЯрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред GET /logout derby-auth







рд╣рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд╕реАрдзреЗ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рдлреЙрд░реНрдо рд▓реЗ рд▓реЗрдВрдЧреЗ, "рд╕рд╛рдЗрди рдЗрди" http:// getbootstrap-examples/signin/ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ



рд╕реНрдЯрд╛рдЗрд▓реНрд╕ рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - slyles / index.styl рдлрд╝рд╛рдЗрд▓
 .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .checkbox { font-weight: normal; } .form-signin .form-control { position: relative; height: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 10px; font-size: 16px; } .form-signin .form-control:focus { z-index: 2; } .form-signin input[type="email"] { margin-bottom: -1px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .form-signin input[type="password"] { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; }
      
      









рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд╕рд╛рде Login.html рдлрд╝рд╛рдЗрд▓:



 <index:> <view name="signin"></view> <hr/> <view name="signup"></view> <signin:> <div class="container"> <form class="form-signin" role="form" action='/login' method='post'> <h3 class="form-signin-heading"></h3> <input name="username" type="text" class="form-control" placeholder="" required="" autofocus=""> <input name="password" type="password" class="form-control" placeholder="" required=""> <button class="btn btn-lg btn-primary btn-block" type="submit"></button> <br/> <a class="btn btn-lg btn-danger btn-block" href="/auth/github"> GitHub</a> </form> </div> <signup:> <div class="container"> <form class="form-signin" role="form" action='/register' method='post'> <h3 class="form-signin-heading"></h3> <input name="username" type="text" class="form-control" placeholder="" required="" autofocus=""> <input name="email" type="email" class="form-control" placeholder="" required=""> <input name="password" type="password" class="form-control" placeholder="" required=""> <button class="btn btn-lg btn-primary btn-block" type="submit"></button> </form> </div>
      
      







рдпрджрд┐ рдЖрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рдм рдХреБрдЫ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:





рдореИрдВрдиреЗ рд╣рдорд╛рд░реЗ рдбрд░реНрдмреА-рдСрд░реНрдереЛрд░рд┐рдХ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдЯрд╕реНрдЯреИрдк рдлреЙрд░реНрдо рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ред рд╣рдо рдкрдВрдЬреАрдХрд░рдг рдлреЙрд░реНрдо рдореЗрдВ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ: рдпрд╣ рдкреЛрд╕реНрдЯ рдлреЙрд░реНрдо рд╣реИ рдЬреЛ рдПрдХреНрд╢рди / рд▓реЙрдЧрд┐рди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ - рдбрд░реНрдмреА-рдУрд░реНрдЯ рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛, рдпреВрдЬрд░рдиреЗрдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдлреАрд▓реНрдб рдирд╛рдо рд╕рднреА рд╣рдорд╛рд░реА рдкреНрд▓реЗрдЯ рд╕реЗ рд╣реИрдВред GitHub рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди - рд╡рд╣рд╛рдБ рд╕реЗ рднреА / / рдЧреАрдердм - рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред



рдкрдВрдЬреАрдХрд░рдг рдлрд╛рд░реНрдоред рд╕рдорд╛рди рдЪреАрдЬрд╝ - рдкреЛрд╕реНрдЯ / рд░рдЬрд┐рд╕реНрдЯрд░, рдлрд╝реАрд▓реНрдб: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдИрдореЗрд▓, рдкрд╛рд╕рд╡рд░реНрдбред



рд╣рдо рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: npm рд╢реБрд░реВ - рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВ - "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рд╣реИ", рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ, рджреЗрдЦреЗрдВ - "рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛"ред рд╣рдо рдЖрдЙрдЯрдкреБрдЯ - / рд▓реЙрдЧрдЖрдЙрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рддрдХ рд╣рдо рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреАрдердм рдЦрд╛рддреЗ рдХреЛ рдЪрд╛рд▓реВ рдЦрд╛рддреЗ рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ "рдЬреАрдердм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рдо рдЬреАрдердм рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд╣рдо рд╡рд╣рд╛рдБ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВрдЧреЗ, рд╕рдм рдХреБрдЫ рдкрдХреНрдХрд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд╛рдЗрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдБрдЧреЗред



рдбрд░реНрдмреА-рдУрд░реНрдЯ рднреА рдПрдХ рд╕реНрдерд╛рдиреАрдп рд░рдгрдиреАрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХрд░рдг рдХрд┐рдП рдмрд┐рдирд╛, рд╕рд╛рдорд╛рдЬрд┐рдХ рдЦрд╛рддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХредрдореИрдВ рд╣рдм рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддрдХрдиреАрдХ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЬрдм рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реА рд╕рд╛рдорд╛рдЬрд┐рдХ рдЦрд╛рддреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЦрд╛рддреЗ рдореЗрдВ рдмрд╛рдБрдз рд╕рдХрддрд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд░реНрдмреА-рдСрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЯреНрд╡реАрдХ рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреАред



рдЬреЛ рд╣реБрдЖ рдЙрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓реЛред рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рджреЗрдЦреЗрдВ (рдХрдВрд╕реЛрд▓ рдореЗрдВ app.model.get () рджрд░реНрдЬ рдХрд░реЗрдВ)ред



рдореИрдВ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдордиреЗ рд╢реЗрд╖ рдЪрд┐рдкреНрд╕ рдХреЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ derby-auth



(рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рдмрджрд▓рдирд╛) - рдпрд╣ рд╕рдмрдХ рдбрд░реНрдмреА рдХреЗ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдмрдбрд╝рд╛ рдерд╛ред



рд╣рдордиреЗ рд╕рд░рд▓реАрдХреГрдд рд░реВрдкреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХреЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рддрдХ рдЙрдирдХрд╛ рдЕрдзреНрдпрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЧрд┐рддреБрдм



рдкрд░ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг



рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред рдЖрдк рдмрд╣рд╛рджреБрд░ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рд╛рдмреБрди рдкрд░ рд▓рд┐рдЦреЗрдВ ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдпрд╣ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рд▓рд┐рдЦреВрдВред



рдкреБрдирд╢реНрдЪ

рдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд░реНрдмреАрдЬ рд▓реЗрдЦреЛрдВ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░реА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ: zag2art ред рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рд╣рдм рдкрд░, рдЯреНрд░реИрдХрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ (рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк) рд╣рдм рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХреБрдЫ рднреА рдпрд╛рдж рди рдХрд░реЗрдВред



рдкреА рдкреА рдПрд╕

рд╡реИрд╕реЗ, рдбрд░реНрдмреА 0.6 рдЕрд▓реНрдлрд╛ 7 рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ - рдЕрдВрддрд┐рдо рд░рд┐рд▓реАрдЬ рдХрд░реАрдм рдФрд░ рдХрд░реАрдм рд╣реЛ рд░рд╣реА рд╣реИред



рдЖрдк derbyjs рдХреА рддрд░рд╣ рд╣реИ - рдореБрд╕реАрдмрдд рдирд╣реАрдВ рд▓реЗрддреЗ рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рдбрд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitHub



All Articles