Derby 0.6の孊習の䟋3


このレッスンは、 derbyjsの䞀連のレッスンの継続-リアクティブフルスタックフレヌムワヌクです。 必芁な以前のレッスンを読んでください first 、 second 。

このレッスンは2぀の郚分で構成されたす。1぀目は、ダヌビヌアプリケヌションのサヌバヌ偎の抂芁であり、2぀目は、゜ヌシャルネットワヌクを䜿甚したダヌビヌアプリケヌションでの登録/承認のためのderby-authモゞュヌル passportjsラッパヌの䜿甚です。

パヌト1-ダヌビヌアプリケヌションのサヌバヌコヌド


準備する

前の䟋では、 derby-starterを䜿甚しお、サヌバヌ郚分ずしおの情報の認識を促進したした。 このモゞュヌルは、サヌバヌ蚭定の詳现を隠したした。 サヌバヌでは、ダヌビヌアプリケヌションが暙準のexpressjsアプリケヌションの䞊に構築されおいるこずを思い出させおください。特に、デヌタベヌスがそこに構成され、必芁な高速ミッドりェアが接続されおいたす。 珟圚の䟋では、サヌバヌ偎をより深く凊理する必芁がありたすderby-starterは䜿甚したせん。

誰かがexpressjs粟通しおいないか、 expressjsよく知らない堎合は、Ilya Kantorのすばらしいコヌス nodejsお勧めしたす。

基本アプリケヌション

今日の䟋のベヌスずしお、 derby-boilerplateをコピヌする必芁がありderby-boilerplate 。 実際、これは最初の䟋ず同様の最小限のアプリケヌションですが、サヌバヌ郚分はderby-starterではなくプロゞェクト自䜓にありたす最埌の4番目の゚クスプレスもここで䜿甚され、 redisはたったく䜿甚されたせん -今ではそれなしでも可胜です。 コマンドをコピヌしたす。

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


プロゞェクトの構造を調べおみたしょう-前の䟋ずは異なり、それはすでにかなり戊闘です

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

appフォルダヌには、ダヌビヌアプリケヌションがありたす。 抂略的には、サヌバヌフォルダヌにderby-starter 「アナログ」があり derby-starterを実際にコピヌし、そこにコピヌしお少しコヌミングしたした、その内容をより詳现に分析したす。

stylesずviewsフォルダヌ、スタむルずテンプレヌトにそれぞれ。 index.jsファむルは、前の䟋の内容ず䌌おいたす-党䜓を開始する数行です。

ダヌビヌアプリケヌションのサヌバヌ郚分

たず第䞀に、derbyがexpressjsアプリケヌション䞊で動䜜するずいう事実に再び泚目したす。そのため、それが䜕であるか、 express-middleware䜕か、どのように動䜜するか、゚クスプレスセッションの動䜜、ルヌティングがわからない堎合express-middleware 、ここで停止する必芁がありたす知識のギャップを解消したす。

サヌバヌフォルダヌにあるものを芋おみたしょう。
 error/ index.js server.js 

゚ラヌハンドラヌを゚ラヌフォルダヌに配眮したしたが、ここにはいたせん。 これはexpressjs-middlwareであるずしか蚀えたせん。これは、型指定されたurlハンドラヌがない堎合、たたはアプリケヌションの操䜜䞭に゚ラヌが発生した堎合にトリガヌされたす。 あなた自身のためにそれを把握したい堎合。

index.jsファむルの䞻な目的は、 server.jsファむルで構成された expressを遞択し、蚭定で指定されたポヌトでサヌバヌを䞊げるこずです。
゜ヌスコヌドderby-starterから取られた実質的に倉曎なし
 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远加しおexpressjsを蚭定する楜しい郚分がありたす。 この点を理解するこずは、ダヌビヌの仕組みを理解するための鍵です。

私は4番目の゚クスプレスを䜿甚したすが、3番目ずはいく぀かの違いがありたす。 䞻なこずは、暙準のmiddlwareがexpressディストリビュヌションに含たれおいないため、個別にむンストヌルする必芁があるこずです。

したがっお、このファむルはダヌビヌなしのようになりたす。

Server.jsコヌド、通垞のexpressjsアプリケヌションを䜜成する堎合
 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は、凊理チェヌンを完了するこずで芁求に応答するか残りのmiddlwareに制埡が転送されない、芁求を䜿甚しお䞭間アクションを実行し cookies解析、 cookiesによるセッションの決定など、制埡を転送できたすさらにチェヌンを䞋る。 middlwareの接続順序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ファむルずテンプレヌトを含むデヌタブロックcssスクリプトは含たれたせん 。 クラむアントによるサむトのペヌゞの定期的なリク゚ストでは、バンドルがブラりザにすぐに送信されないため、コストが高すぎるこずを理解する必芁がありたす。 スタむルず初期デヌタを含むレンダリング枈みのペヌゞが掚奚されたす。 ここでは速床が非垞に重芁なので、これは論理的です。 さらに、このペヌゞ自䜓が「バンドル」をロヌドしたす-アドレス「/ derby /bandle-name」で芁求が行われたす。

耇数の「ダヌビヌアプリケヌション」がダヌビヌの1぀のサヌバヌ郚分に察応できるこずは既に述べたした。実際、それぞれに独自のバンドルがありたす。 これは論理的です。 したがっお、たずえば、サむトのクラむアント郚分を管理パネルから分離しお、䞍芁なデヌタを党員に転送しないようにするこずができたす。 その堎合は、登録する必芁がありたす。

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


同じこずがルヌトの凊理にも圓おはたりたす。 uに2぀の「ダヌビヌアプリケヌション」がない堎合、代わりに次のようになりたす。

  expressApp.use(app.router()); 


2぀のアプリケヌションルヌタヌの接続

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


たた、「ダヌビヌアプリケヌション」ルヌトのハンドラヌに加えお、ここにexpressjsハンドラヌを远加しお、ブラックゞャックや若い女性で必芁なRESTFull APIを敎理できるこずも理解しおおく必芁がありたす。 これはすべお、ダヌビヌアプリケヌションのクラむアントルヌタヌが、アプリケヌションで目的のハンドラヌを芋぀けられず、サヌバヌに凊理の芁求を送信するだけで機胜するためです。

次の重芁なポむントは、 browserchannelの接続です。これは、 socket.io Google socket.ioです。 実際、これはトランスポヌトです。これにより、アプリケヌションがリアルタむムでサヌバヌずデヌタを同期したす。 内郚では、特定の瞬間にクラむアントスクリプトbrowserchannelがバンドルに远加され、このモゞュヌルからのリク゚ストを凊理したすロングプヌリングに基づいおいるため、この堎合は/channelでの凊理が必芁です

はい、ダヌビヌの基本的なセットアップ䟋では、 redisは䜿甚されないこずに泚意しおください。 ダヌビヌのアップデヌトが最近リリヌスされたしたが、今ではredis必芁redisたせん氎平スケヌリングを行う堎合、぀たりパフォヌマンスを向䞊させるために耇数のダヌビヌサヌバヌを䞀床に実行する堎合に必芁です。

したがっお、珟時点では、この構造を䜿甚するず、非垞に柔軟にアプリケヌションに䜕かを远加できるこずを理解する必芁がありたす。 䜕らかの皮類のexpressjs-middlware 、ダヌビヌプラグむン、個々のダヌビヌアプリケヌション、゚クスプレスハンドラヌなどです。 これらはすべお䞀緒に静かに暮らすでしょう。

それで、特に認可の問題を考慮しお、セッションに泚意を払う必芁がある最埌のポむントです。 ご芧のずおり、ダヌビヌセッションは非垞にexpressなセッションを䜿甚したす。 ぀たり、すべおは叀兞的なスキヌムに埓っお行われたすmongodbは識別に䜿甚されクラむアントのブラりザに保存されたす、セッション自䜓はsessionsコレクションのmongodbに保存されsessions 。

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(); } 

userIdはそのセッションから取埗され、存圚しない堎合はidがランダムに生成され model.id() 、パス_session.userId このデヌタはシリアル化されおクラむアントに送信されたすずセッション自䜓に沿っおモデルに曞き蟌たれたす。

いく぀かのク゚リオプションを想像しおください。

  1. ナヌザヌが最初にサむトを蚪問し、メむンペヌゞを芁求したした-新しいCookieがサヌバヌ䞊に圢成され、新しいセッション新しいランダムuserId -メむンペヌゞがブラりザヌに描画され、クラむアントでモデルを芋るず、パス '_session.userId'に沿っお-新しく圢成されたIDが衚瀺されたす。 アプリケヌションのペヌゞをさたよいたすサヌバヌぞのリク゚ストはありたせん-クラむアントは垞にそのIDを持ち、サヌバヌぞのリク゚ストを行う堎合、クッキヌずセッションで垞にそれを認識できたす。
  2. ナヌザヌは1週間埌に登録およびログむンしたせんでした。 Cookieは圌から保存されたす-圌には同じuserIdが䞎えられたす-すべおは問題ありたせん。
  3. ナヌザヌが別のブラりザヌからログむンした-ステップ1ず同じ

サヌバヌの芳点から登録/承認をどのように開発するずしたす。 クラむアントがブラりザに登録デヌタを入力したずしたす-その埌、ナヌザヌコレクションに゚ントリを䜜成するサヌバヌに移動する必芁がありたす。IDを䜜成する必芁はなく、既に存圚したす。

承認がさらに困難になるず、サむトにアクセスするクラむアントはランダムIDを受け取り、承認ペヌゞに移動したす-ナヌザヌ名/パスワヌドを入力し、サヌバヌにすべお転送したす。サヌバヌは、セッションず_session.userId userIdを倉曎する必芁があるこずを理解したす

このコレクションに䜕を保存したすか。 最も可胜性が高いのは、ナヌザヌ名、メヌル、passwordHash、独自の統蚈情報などです。 私たちのサむトに゜ヌシャル経由の承認登録がある堎合。 ネットワヌク、゜ヌシャルネットワヌクのキヌはここに保存されたす。 たた、もちろん、ナヌザヌ蚭定もここに保存しおおくずいいでしょう。

圓然、このコレクションの䞀郚をクラむアントで衚瀺できないようにしおください。 これで問題はありたせん。 最近、いわゆるプロゞェクションがダヌビヌコレクションにサブスクラむブする機胜、ドキュメント党䜓ではなく、その特定のフィヌルドのみにサブスクラむブする機胜に登堎したしたが、数週間前-それは䞍可胜でした、そしおこれに぀いお怜蚎するderby-authモゞュヌルただできたせん。 ナヌザヌデヌタを2぀の郚分に分けお䜿甚したすauths目はauthsコレクションここではプラむベヌトデヌタのみ、2぀目のusersはここで公開デヌタです。 だからderby-auth

パヌト2-ダヌビヌアプリケヌションでの承認derby-authモゞュヌル


ダヌビヌ認蚌に぀いお

珟時点では、2぀のパッケヌゞがありたす-ダヌビヌの承認。 これらはderby-authずderby-passportです。 どちらもpassportjsラッパヌです私の意芋では、そのうちの1぀は別のフォヌクです。 䞡方の珟圚のバヌゞョンはダヌビヌの5番目のバヌゞョンアルファで6番目のバヌゞョンを思い出すで䜿甚するこずを目的ずしおおり、6日でただ曎新されおいたせんが、6-keのすべおのプロゞェクトでderby-authを䜿甚するこずを劚げたせんhtmlフォヌムテンプレヌトのみですが、いずれにしおもカスタムです。

私がderby-authを遞択したのは、それを䜿ったからです。

既に蚀及した別の制限は、これらのプロゞェクトの䞡方のナヌザヌデヌタが2぀の郚分に分割されるこずです。 パブリックデヌタはusersコレクションに保存し、 authsプラむベヌトデヌタを保存する必芁がありusers 。 最近、ダヌビヌには「投圱」、぀たりコレクションの特定のフィヌルドのみをサブスクラむブする機䌚がありたす。これらのモゞュヌルがダヌビヌの第6バヌゞョンに曎新されるず、制限はなくなるず思いたす。

曎新する
この蚘事を曞いおから数日埌、Vladimir Makhaev@vmakhaevはderby-authに基づいた玠晎らしいderby-login認蚌モゞュヌルを開発したした。 0.6未満で、プロゞェクションをサポヌトし、登録、入力、パスワヌドの倉曎のための既補のコンポヌネントを備えおいたす-芁するに、それだけを䜿甚したす。

ちなみに、少なくずもgithubにアスタリスクを付けお、りラゞミヌルに感謝するこずを忘れないでください。 圌はずおも䟿利なこずをしたした。

passportjsに぀いお


PassportJSは、 node.jsでの承認甚middlewareです。 これは、アプリケヌションがログむンずパスワヌドを䜿甚した通垞の蚱可ず、Oauth、Oauth 2などをサポヌトするほがすべおのサヌビスによる蚱可の䞡方を䜿甚できるようにする抜象モゞュヌルです。 認可。 ここでは、承認方法を戊略ず呌びたす。 たずえば、ログむン/パスワヌド認蚌はLocalStrategy 「ロヌカル認蚌戊略」ずGithubStrategy 、GitHub認蚌はGithubStrategyずGithubStrategy 。 各戊略は個別のモゞュヌルに配眮されるため、この党䜓をnode.jsアプリケヌションに接続するず次のようになりたす。
 var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var GithubStrategy = require('passport-github').Strategy; 


たた、゜ヌシャルネットワヌクを介しお承認戊略を䜿甚する機胜にも泚意する必芁がありたす。 他の誰かが知らない堎合、アプリケヌションがそのような承認を䜿甚する前に、゜ヌシャルアプリケヌションに登録する必芁がありたす。 ネットワヌクず2぀のパラメヌタヌを取埗したす。 appId たたはclientIdはこの゜ヌシャルネットワヌク内のアプリケヌションの䞀意のid-shnikですずSecret誰にも蚀えない秘密鍵、アプリケヌションが確認できるように䜿甚されたす私たちは私たちです。 登録時には、いわゆるredirectURL 、぀たり゜ヌシャルのURLアドレスを入力する必芁がありたす。 ネットワヌクは認蚌埌にクラむアントのブラりザをリダむレクトしたす。 私の䟋では、これは次のようになりたす localhost 3000 / auth / github / callback-しかし、これに぀いおは埌で詳しく説明したす。

サンプルアプリケヌションでは、 githubを介しお承認を䜿甚し、アプリケヌションを登録するのは非垞に簡単です他のプロバむダヌにずっおはそれほど難しくありたせん。 たず、通垞のナヌザヌアカりントが必芁です。蚭定でアプリケヌションを簡単に䜜成できたす。


誰にも私の秘密を教えないでください。

derby-authをアプリケヌションに接続したす

そのため、たず、gitリポゞトリからderby-auth盎接配眮したす。䜕らかの理由で、以前のderbyマスタヌバヌゞョンがありたす。

npm install 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自䜓を接続し、戊略を蚭定したす通垞のアプリケヌションでは、蚭定は蚭定ファむルたたは環境倉数から取埗する必芁がありたす

  //  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承認にsuccessRedirectした堎合/成功した堎合にクラむアントがリダむレクトされるURL。 サむトに関する情報は、戊略を送信するために必芁ですたずえば、アプリケヌションの登録時に察応するフィヌルドが入力されおいない堎合、゜ヌシャルネットワヌクで䜿甚できたす。 「パスワヌドを忘れた堎合-パスワヌドをリセットしお、石鹞甚の新しいパスワヌドを送信する」ためには、メヌルパラメヌタが必芁です。

ステップ3

ストレヌゞを初期化する

  auth.store(store, false, strategies); 


このステップで、 derby-authはデヌタにアクセス制埡を远加したす。ナヌザヌはauthsコレクションから他の人のレコヌドを取埗できたせん-自分のアカりントのみが衚瀺されたす。 2番目のパラメヌタヌは珟圚䜿甚されおいたせん。

ステップ4

, middleware 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)); 


, . — middleware, , - expressjs , url. — :
パラメヌタ行き先
/loginpostusername, password
/registerpostusername, email, password
/auth/:providerget. ネットワヌク。
: /auth/github
/auth/:provider/callbackget. — derby-auth failureRedirect successRedirect url.
: /auth/github/callback — url , . ネットワヌク。
/logoutget«» '/'
/password-resetpostemailemail ( AJAX)
/password-changepostuid, oldPassword, newPassword( AJAX)


() — (html / ..), 0.5 . , , . .



Derby-auth , , id, , :
させお説明
_session.loggedIn— /
_session.userIdid
_session.flash.error— ( /)
auth.{userId}.local
auth。{userId}。{provider}関連する゜ヌシャルを通じた登録デヌタ。 ネット

これらはすべおテンプレヌトで利甚でき、承認ステヌタスを刀断するために䜿甚されたす。

応甚䟋

䞀般に、もちろん、ビゞュアルコンポヌネントderby-authがダヌビヌの6番目のバヌゞョンに適合しおいる堎合、アプリケヌションは2぀のアカりントで蚘述されたすが、それなしではより困難です。開発を簡玠化するために、接続bootstrapしたす。このために、src / app / index.jsに入力したす
 app.use(require('d-bootstrap')); 

出来䞊がり
 npm i d-bootstrap -S 

.

2 : , "/" , , , , '/login' , . , 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 c index.html , home.html login.html , , (/ , github-), /.

, 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> 



— ( alert-). , , :

 <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

, «sign in» http://getbootstrap.com/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> 


-:


, derby-auth . : post /login — derby-auth, username password — . GitHub — get /auth/github — .

. — post /register, : username, email, password.

: npm start — — « », , — « ». — /logout. github-, « github», , , .

Derby-auth , , . ネットワヌク。 , , . , derby-auth .

, . , ( app.model.get() ).

, derby-auth ( ) — - .

, , , .

github

, - , , . — . , .

PS
derbyjs, : zag2art . — ( ) , .

PPS
, 0.6 alpha 7 — .

derbyjs — github

Source: https://habr.com/ru/post/J222399/


All Articles