Devise for Railsãšç«¶åã§ããNode / Expressã®ä¿¡é Œæ§ã®é«ãå æ¬çãªèªèšŒãœãªã¥ãŒã·ã§ã³ãæ¢ããŠããããšãããã«èšããªããã°ãªããŸããã ãããããªãŒããŒã·ããã®åéã§ã®æ鬱ãªç¶æ³ã¯ãç§ããã®è³æãæºåããããšã奚å±ããŸããã ããã§ã¯ãèªèšŒã®åéã§æãäžè¬çãªãšã©ãŒã®ããã€ãã説æããããããåé¿ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
äžèšã®ãçµéšã®æµ ãéçºè ãã«ã€ããŠè©±ããŸããã 圌ãã¯èª°ã§ããïŒ ããšãã°ããµãŒããŒãµã€ãJSã®æžŠã«æã蟌ãŸããæ°å人ã®ããã³ããšã³ãããã°ã©ããŒããããã¥ã¢ã«ããå®çšçãªçµéšãåŸãããšããŠããŸãããŸãã¯ãnpm installã䜿çšããŠãæå ã«ãããã®ããã¹ãŠã³ããŒã¢ã³ãããŒã¹ãããŠãã¹ãŠãã€ã³ã¹ããŒã«ããŸãã åé¡ã®çå£ãªç 究ã«æéãè²»ãããªãã®ã¯ãªãã§ããïŒ äºå®ã圌ãã¯è¯ãç掻ããã³ããŒã¢ã³ãããŒã¹ããããã¢ãŠããœãŒã·ã³ã°ãããŒãžã£ãŒãåºå代çåºã®ããçš®ã®ã¯ãªãšã€ãã£ããã£ã¬ã¯ã¿ãŒã«ãã£ãŠèšå®ãããæéã«éã«åãããããã«éªéã«ãªããªãããã«ããªããã°ãªããŸããã
å®éãé©åãªèªèšŒã¬ã€ããæ¢ããŠãããšãã«ãããã°ãæã£ãŠãããã¹ãŠã®Nodeããã°ã©ããŒã¯ããæ£ããè¡ããæ¹æ³ããŸãã¯ãæ¹æ³ãã«é¢ããç¬èªã®ãã¥ãŒããªã¢ã«ãå ¬éããŠãããšæããŸããçµãã£ããã
Node.jsã®éçºã§è°è«ã®äœå°ãããã®ã¯ãå æ¬çã§ä¿¡é Œæ§ã®é«ãèªèšŒãœãªã¥ãŒã·ã§ã³ã®æ¬ åŠã§ãã ãã®è³ªåã¯ãäž»ã«ããã°ã©ããŒã®äžçš®ã®éåãšèŠãªãããŸãã Passportã¯Express.jsã®äºå®äžã®æšæºã§ããããã®ãœãªã¥ãŒã·ã§ã³ã¯èªèšŒæŠç¥ã®ã»ããã®ã¿ãæäŸããŸãã Ruby on Railsã®Platformatec Deviseã®ãããªNodeã®å ç¢ãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠãªå Žåã¯ãããããèªèšŒãšããŠãµãŒãã¹ãæäŸããã¹ã¿ãŒãã¢ããAuth0ã䜿çšããå¿ èŠããããŸãã
æ¬æ ŒçãªDeviseãšã¯ç°ãªãããã¹ããŒãã¯äžéã®ãœãããŠã§ã¢å±€ã§ãããããèªäœã§ã¯èªèšŒããã»ã¹ã®ãã¹ãŠã®éšåãã«ããŒããŸããã Nodeéçºè ã¯Passportã䜿çšããŠãããŒã¯ã³ã¡ã«ããºã ãšãã¹ã¯ãŒããªã»ããçšã®ç¬èªã®APIãäœæããå¿ èŠããããŸãã ãŠãŒã¶ãŒèªèšŒã®ããã«ã«ãŒããšãšã³ããã€ã³ããæºåããå¿ èŠããããŸãã ãã®äžã«ã¯ãããšãã°ãããã€ãã®äžè¬çãªãã³ãã¬ãŒãèšèªã䜿çšããã€ã³ã¿ãŒãã§ãŒã¹ã®äœæããããŸãã ãã®ãããPassport for Express.jsã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ãæ¯æŽããããšãç®çãšãããã¥ãŒããªã¢ã«ãå€æ°ãããŸãã ãããã®ã»ãšãã©ãã¹ãŠã«ç¹å®ã®ãšã©ãŒãå«ãŸããŠããŸãã ãããããæ©èœããWebã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªæ¬æ Œçãªãœãªã¥ãŒã·ã§ã³ãäœæããããšã¯ã§ããŸããã
ãããã®ããã¥ã¢ã«ã®ç¹å®ã®äœæè ãæ»æããã®ã§ã¯ãªããèªåã®èªèšŒã·ã¹ãã ã®å±éã«é¢é£ããã»ãã¥ãªãã£äžã®åé¡ãå®èšŒããããã«ãšã©ãŒã䜿çšããŸãã ããªãããã®ãããªã¬ã€ãã®èè ã§ããå Žåããã®è³æãèªãã åŸãã¬ã€ãã«å€æŽãå ãããã©ãããæããŠãã ããã Node / Expressãšã³ã·ã¹ãã ãããå®å šã«ããæ°ããéçºè ãã¢ã¯ã»ã¹ããããããŸãããã
ééã1ïŒèªèšŒæ å ±ã®ä¿å
ã¯ã¬ãã³ã·ã£ã«ã¹ãã¬ãŒãžããå§ããŸãããã è³æ Œæ å ±ã®æžã蟌ã¿ãšèªã¿åãã¯ãèªèšŒç®¡çã®åéã§éåžžã«äžè¬çãªã¿ã¹ã¯ã§ããããããã®åé¡ã解決ããåŸæ¥ã®æ¹æ³ã¯ãç¬èªã®ããŒã¿ããŒã¹ã䜿çšããããšã§ãã Passportã¯ãããã®ãŠãŒã¶ãŒã¯ãã¹ãã«åæ ŒããŸããããŸãã¯ããã®ãŠãŒã¶ãŒã¯ãã¹ãã«åæ ŒããŸããã§ããããšããã¢ããªã±ãŒã·ã§ã³ã«åçŽã«äŒããäžéãœãããŠã§ã¢ã§ãããããŒã«ã«ããŒã¿ããŒã¹ã®ãã¹ã¯ãŒãã¹ãã¬ãŒãžãæäœããããã«passport-localã¢ãžã¥ãŒã«ãå¿ èŠã§ãã ãã®ã¢ãžã¥ãŒã«ã¯ãPassport.jsèªäœãšåãéçºè ã«ãã£ãŠäœæãããŠããŸãã
ãã¥ãŒããªã¢ã«ã§ãã®ãããã®ç©Žã«é²ãåã«ãOWASPãçšæããåªãããã¹ã¯ãŒãã¹ãã¬ãŒãžã®ããŒãã·ãŒããæãåºããŠã¿ãŸããããããã¯ãéåžžã«ãšã³ããããŒãªãã¹ã¯ãŒããäžæã®ãå¡©ãã§ä¿åããäžæ¹åã®é©å¿ããã·ã¥é¢æ°ã䜿çšããããšã§ãã ããã§ã¯ ããã®åé¡ã«é¢ããŠæèŠã®çžéã¯ãããŸãããcodahale.comã®bcryptããŒã ãæãåºãããšãã§ããŸãã
ç§ã¯ãå¿ èŠãªãã®ãæ¢ããŠãæ°ãããŠãŒã¶ãŒExpress.jsãšPassportã®ãã¹ãç¹°ãè¿ããæåã«passport-localèªäœã®äŸã調ã¹ãŸããã Express 4.0ã®ã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒããããããããã³ããŒããŠèªåã®ããŒãºã«åãããŠæ¡åŒµã§ããŸããã ãã ãããã®ã³ãŒããã³ããŒããã ãã§ã¯ãå€ãã®æçšãªãã®ã¯åŸãããŸããã§ããã ããšãã°ãããŒã¿ããŒã¹ãµããŒããµãã·ã¹ãã ã¯ãããŸããã§ããã ãã®äŸã§ã¯ãç¹å®ã®ã¢ã«ãŠã³ãã»ãããåçŽã«äœ¿çšããŸããã
äžèŠããã¹ãŠãæ£åžžãªããã§ãã éåžžã®ã€ã³ãã©ãããã¢ããªã±ãŒã·ã§ã³ã§ãã ããã䜿çšããéçºè ã¯éåžžã«å¿ãããäœããçå£ã«æ¹åããæéã¯ãããŸããã äŸã®ãã¹ã¯ãŒããããã·ã¥ãããŠããªãããšã¯åé¡ã§ã¯ãããŸããã ãããã¯ãæ€èšŒããžãã¯ã³ãŒãã®ãã暪ã«ãã¬ãŒã³ããã¹ãã§ä¿åãããŸãã ãŸããè³æ Œæ å ±ã¹ãã¬ãŒãžã¯ããã§ã¯èæ ®ãããŠããŸããã çŽ æŽãããèªèšŒã·ã¹ãã ã
å¥ã®ãã¹ããŒãããŒã«ã«ãã¥ãŒããªã¢ã«ãæ¢ããŸãããã ããšãã°ãNode Heroãã¥ãŒããªã¢ã«ã·ãªãŒãºã®äžéšã§ããRisingStackãããã®è³æã«åºäŒããŸããã ãããããã®åºçç©ã¯ãŸã£ãã圹ã«ç«ã¡ãŸããã§ããã 圌女ã¯GitHubã§ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãæäŸããŸããããå ¬åŒã¬ã€ããšåãåé¡ããããŸããã ãã ãã8æ8æ¥ã«RisingStackããã¢ã¢ããªã±ãŒã·ã§ã³ã§bcryptã䜿çšããããã«ãªã£ãããšã«æ³šæããŠãã ããã
次ã«ãGoogleããã®å¥ã®çµæããããŸããããã¯ã
express js passport-local tutorial
ãªã¯ãšã¹ãã«å¿ããŠçºè¡ãããŸãã ãã®ããã¥ã¢ã«ã¯2015幎ã«äœæãããŸããã Mongoose ODMã䜿çšããããŒã¿ããŒã¹ããè³æ Œæ å ±ãèªã¿åããŸãã çµ±åãã¹ããå«ããã¹ãŠã®ãã®ãããããã¡ããã䜿çšã§ããå¥ã®ãã³ãã¬ãŒãããããŸãã ãã ããMongoose ODMã¯ã以åã®ããã¥ã¢ã«ã®ããã«ãä»åã¯MongoDBã€ã³ã¹ã¿ã³ã¹ã§ã®ã¿ã StringããŒã¿åã䜿çšããŠãã¹ã¯ãŒãããã¬ãŒã³ããã¹ãã§ä¿åããŸãã ãããŠãMongoDBã€ã³ã¹ã¿ã³ã¹ã¯éåžžéåžžã«ããä¿è·ãããŠããããšã誰ããç¥ã£ãŠããŸãã
åŠç¿ã¬ã€ãã®åã£ãéžæã«ã€ããŠç§ãéé£ããããšãã§ããŸããåã£ãéžæãGoogleã®æ€çŽ¢çµæã®æåã®ããŒãžãããªã³ã¯ãã¯ãªãã¯ããããšãæå³ããå Žåãããªãã¯æ£ããã§ãããã
ããã§ãæ€çŽ¢çµæããŒãžã®äžçªäžããè³æãååŸããŸããããã¯ãTutsPlusã®ãã¹ããŒãããŒã«ã«ã¬ã€ãã§ãã ãã®ãã¥ãŒããªã¢ã«ã®æ¹ãåªããŠã
process.nextTick
ããã¹ã¯ãŒããããã·ã¥ããããã«åŽåç10ã®bcryptã䜿çšãã
process.nextTick
ã䜿çšã
process.nextTick
åæããã·ã¥ãã§ãã¯ãé ãã
process.nextTick
ã
Googleã®äžçªäžã®çµæã¯ã scotch.ioã®ããã¥ã¢ã«ã§ã ããããã8ãšããäœãåŽåçã®bcryptã䜿çšããŠããŸãã8ãš10ã¯ã©ã¡ããå°æ°ã§ããã8ã¯éåžžã«å°ããã§ãã æè¿ã®bcryptã©ã€ãã©ãªã®ã»ãšãã©ã¯12ã䜿çšããŠããŸããæåã®bcryptä»æ§ããªãªãŒã¹ãããçŽåŸã 18幎åã®ç®¡çã¢ã«ãŠã³ãã§ã¯8ã®åŽåä¿æ°ãé©åã§ããã
æ©å¯ããŒã¿ã®ä¿åã«ã€ããŠãèšåããŠããŸãããããããã®ã¬ã€ãã¯ãããããã¹ã¯ãŒããªã»ããã¡ã«ããºã ã®å®è£ ã瀺ããŠããŸããã å€ãã®èœãšãç©ŽãããèªèšŒã·ã¹ãã ã®ãã®æãéèŠãªéšåã¯ãéçºè ã®æŒç¿ãšããŠæ®ãããŸããã
ééã2ïŒãã¹ã¯ãŒããªã»ããã·ã¹ãã
åæ§ã®ã»ãã¥ãªãã£åé¡ã¯ãã¹ã¯ãŒãã®ãªã»ããã§ãã æ€çŽ¢çµæã®äžéšã«ããããã¥ã¢ã«ã«ã¯ãPassportã䜿çšããŠãããè¡ãæ¹æ³ã«ã€ããŠã¯äœãèšèŒãããŠããŸããã 調ã¹ãã«ã¯ãäœãä»ã®ãã®ãæ¢ãå¿ èŠããããŸãã
ãã¹ã¯ãŒããªã»ããã®ã±ãŒã¹ãå°ç¡ãã«ããæ¹æ³ã¯æ°åãããŸãã ãã®åé¡ã解決ããéã«ç§ãå¶ç¶ç®ã«ããæãäžè¬çãªãšã©ãŒã¯æ¬¡ã®ãšããã§ãã
- äºæž¬å¯èœãªããŒã¯ã³ ã çŸåšã®æå»ã«åºã¥ããããŒã¯ã³ãè¯ãäŸã§ãã 貧匱ãªæ¬äŒŒä¹±æ°ãžã§ãã¬ãŒã¿ã«åºã¥ããŠæ§ç¯ãããããŒã¯ã³ã¯ãèŠãç®ã¯è¯ããŠãåé¡ã解決ããŸããã
- äžæ£ãªããŒã¿ãŠã§ã¢ããŠã¹ ã æå·åãããŠããªããã¹ã¯ãŒããªã»ããããŒã¯ã³ãããŒã¿ããŒã¹ã«ä¿åãããšã解èªãããå Žåããããã®ããŒã¯ã³ã¯ãã¬ãŒã³ããã¹ãã§ä¿åããããã¹ã¯ãŒããšåçã«ãªããŸãã æå·çã«å
ç¢ãªæ¬äŒŒä¹±æ°ãžã§ãã¬ãŒã¿ã䜿çšããŠé·ãããŒã¯ã³ãäœæãããšããã«ãŒããã©ãŒã¹ã䜿çšããŠãã¹ã¯ãŒããªã»ããããŒã¯ã³ã«å¯Ÿãããªã¢ãŒãæ»æãé²ãããšãã§ããŸãããããŒã«ã«æ»æããã¯ä¿è·ãããŸããã ãã¹ã¯ãŒããªã»ããçšã®ããŒã¯ã³ã¯è³æ Œæ
å ±ãšããŠååŸããããã«å¿ããŠåŠçããå¿
èŠããããŸãã
- æéåãã«ãªããªãããŒã¯ã³ ã ããŒã¯ã³ã®æå¹æéãåããŠããªãå Žåãæ»æè
ã¯äžæçãªãã¹ã¯ãŒããªã»ãããŠã£ã³ããŠã䜿çšããæéããããŸãã
- è¿œå ã®ãã§ãã¯ã®æ¬ åŠ ã ãã¹ã¯ãŒãããªã»ããããéã®è¿œå ã®è³ªåã¯ãäºå®äžã®ããŒã¿æ€èšŒæšæºã§ãã ãã¡ãããããã¯éçºè
ãé©åãªè³ªåãéžæããå Žåã«ã®ã¿æåŸ
ã©ããã«æ©èœããŸãã ãã®ãããªè³ªåã«ã¯ããããåé¡ããããŸãã ããã§ã¯ããã¹ã¯ãŒãã®å埩ã«é»åã¡ãŒã«ã䜿çšããããšã«èšåãã䟡å€ããããŸãããããã«ã€ããŠã®æšè«ã¯äžå¿
èŠãªåä¿éºã®ããã«æãããããããŸããã ããªãã®ã¡ãŒã«ã¢ãã¬ã¹ã¯ããªããç¥ã£ãŠãããã®ã§ã¯ãªããããªããæã£ãŠãããã®ã§ãã ããŸããŸãªèªèšŒèŠçŽ ãçµã¿åãããŠããŸãã ãã®çµæãã¡ãŒã«ã¢ãã¬ã¹ã¯ããã¹ã¯ãŒããªã»ããããŒã¯ã³ãéä¿¡ããã ãã®ã¢ã«ãŠã³ãã®ããŒã«ãªããŸãã
ãã®ãã¹ãŠã«åºäŒã£ãããšããªãå Žåã¯ãOWASPãã¹ã¯ãŒããªã»ããã®ããŒãã·ãŒããã芧ãã ããã ããã§ãäžè¬çãªåé¡ã«ã€ããŠèª¬æããã®ã§ã詳现ã«é²ã¿ãNodeãšã³ã·ã¹ãã ãæäŸãããã®ãèŠãŠã¿ãŸãããã
ãã°ããnpmã«åãæ¿ããŠã誰ããã©ã€ãã©ãªãäœæããŠãã¹ã¯ãŒãããªã»ãããããã©ããã確èªããŸãã ããšãã°ãããã«ã¯ãäžè¬çã«åªãããµãã¹ã¿ãã¯çºè¡è ã®5幎åã®ããã±ãŒãžããããŸã ã Nodeã®éçºé床ãèãããšããã®ããã±ãŒãžã¯æç«ã«äŒŒãŠããã
Math.random()
ã¿ããå Žåã
Math.random()
é¢æ°ã¯V8ã§äºæž¬å¯èœã§ãããããããŒã¯ã³ã®äœæã«ã¯äœ¿çšããªãã§ãã ãã ã ããã«ããã®ããã±ãŒãžã§ã¯Passportã䜿çšããªããããããã«å ã«é²ã¿ãŸãã
ããã§ãStack Overflowã¯ããŸã圹ã«ç«ã¡ãŸããã§ããã çµå±ã®ãšãããStormpathã®éçºè ã¯ãå°ãªããšãäœããã®åœ¢ã§ãã®ãããã¯ã«é¢é£ããæçš¿ã§IaaSã¹ã¿ãŒãã¢ããã«ã€ããŠæžãã®ã倧奜ãã§ãã ãŸãã ããã¥ã¡ã³ãã¯ã©ãã«ã§ã衚瀺ããããã¹ã¯ãŒãããªã»ããããããã®è³æãããããã°ã宣äŒããŠããŸãã ãã ãããã®ãã¹ãŠãèªãããšã¯æéã®ç¡é§ã§ãã Stormpath-2017幎8æ17æ¥ã«é皌åã®ãããžã§ã¯ããçµäºããŸã ã
ã§ã¯ãGoogleæ€çŽ¢ã«æ»ããŸãã å®éãç§ãã¡ã«ãšã£ãŠé¢å¿ã®ãããããã¯ã¯åäžã®è³æã§é瀺ãããŠããããã§ãã
express passport password reset
æåã«èŠã€ãã£ãçµæãèŠãŠã¿ãŸãããã ããã§ããåŽåéçŽåºŠã5ã§ãããçŸä»£ã®ç¶æ³ã§å¿ èŠãªãã®ãããã¯ããã«å°ãªãæ§åã®æå·ã«åºäŒããŸãã
ãã ãããã®ã¬ã€ãã¯ã
crypto.randomBytes
ã䜿çšããŠã䜿çšãããªãã£ãå Žåã«æéåãã«ãªãçã«ã©ã³ãã ãªããŒã¯ã³ãäœæãããããä»ã®ã¬ã€ããšæ¯èŒãããšããªãå šäœçã«èŠããŸãã ãã ãããã®æ·±å»ãªã¬ã€ãã§ã¯ããã¹ã¯ãŒãããªã»ããããéã®äžèšã®ãšã©ãŒãªã¹ãã®ãã€ã³ã2ããã³4ã¯èæ ®ãããŠããŸããã ããŒã¯ã³ã¯å®å šã«ä¿åãããŸãã-è³æ Œæ å ±ã®ä¿åã«é¢é£ããèªèšŒããã¥ã¢ã«ã®æåã®ãšã©ãŒãæãåºããŸãã
è¯ãããšã¯ããã®ãããªã·ã¹ãã ããçãŸããããŒã¯ã³ã®æå¹æéãéãããŠããããšã§ãã ãã ããæ»æè ãBSONã€ã³ãžã§ã¯ã·ã§ã³ãä»ããŠããŒã¿ããŒã¹å ã®ãŠãŒã¶ãŒãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããå ŽåããŸãã¯äžé©åãªDBMSèšå®ã®ããã«Mongoãèªç±ã«ã¢ã¯ã»ã¹ã§ããå Žåããããã®ããŒã¯ã³ã®æäœã¯éåžžã«æ¥œããã§ãã æ»æè ã¯ãåãŠãŒã¶ãŒã®ãã¹ã¯ãŒããªã»ããããã»ã¹ãéå§ããããŒã¿ããŒã¹ããæå·åãããŠããªãããŒã¯ã³ãèªã¿åãããŠãŒã¶ãŒã¢ã«ãŠã³ãã®ç¬èªã®ãã¹ã¯ãŒããäœæããã ãã§ãè€æ°ã®ãããªã«ãŒããåãã匷åãªã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠãbcryptããã·ã¥ã«å¯ŸãããªãœãŒã¹éäžåã®èŸæžæ»æãè¡ãããšãã§ããŸãã
ééã3ïŒAPIããŒã¯ã³
APIããŒã¯ã³ãè³æ Œæ å ±ã§ãã ãã¹ã¯ãŒãããã¹ã¯ãŒããªã»ããããŒã¯ã³ãšåããããéèŠã§ãã ã»ãšãã©ãã¹ãŠã®éçºè ã¯ãããç¥ã£ãŠãããAWSããŒãTwitterã¢ã¯ã»ã¹ââã³ãŒããããã³ãã®ä»ã®é¡äŒŒã®ãã®ãéåžžã«å®å šã«ä¿åããããšããŸãããå€ãã®å Žåãããã¯äœæããããã°ã©ã ã«ã¯é©çšãããŸããã
JSON Web Tokens ïŒJWTïŒã·ã¹ãã ã䜿çšããŠãAPIã¢ã¯ã»ã¹è³æ Œæ å ±ãäœæããŸãã ãã©ãã¯ãªã¹ãã«è¿œå ã§ãããªã¯ãšã¹ãããå¿ èŠãããã¹ããŒãã¬ã¹ããŒã¯ã³ã䜿çšããããšã¯ãè¿å¹Žäœ¿çšãããŠããå€ãAPIããŒ/ã·ãŒã¯ã¬ãããã³ãã¬ãŒããããåªããŠããŸãã ãããããåå¿è ã®Node.jséçºè ãJWTã«ã€ããŠèããããšãããããpassport-jwtããã±ãŒãžãèŠãŠããããžã§ã¯ãã«JWTæŠç¥ãå®è£ ããããšã«ããã®ãããããŸããã ãããã«ãããJWTã¯Node.jsã®åœ±é¿ç¯å²ã«èª°ããé¥ããããªå Žæã§ãã ïŒç±ç·ããThomas Ptashekã¯JWTãæªããšè¿°ã¹ãŠããŸãããã ããã圌ãèããšã¯æããŸããïŒã
Googleã§
express js jwt
ãæ€çŽ¢ããæ€çŽ¢çµæã®æåã®è³æã§ããJWTã䜿çšãããŠãŒã¶ãŒèªèšŒã«é¢ããSony
express js jwt
ãŸãããã æ®å¿µãªãããPassportã¯äœ¿çšãããŠããªãããããã®è³æã¯äœã®å©ãã«ããªããŸãããã確èªäžã«è³æ Œæ å ±ã®ä¿åã«é¢ãããšã©ãŒã«æ³šæããŠãã ããã
- JWTããŒã¯ GitHubãªããžããªã«ãã¬ãŒã³ããã¹ããšããŠä¿åãããŸãã
- 察称æå·ã¯ããã¹ã¯ãŒãã®ä¿åã«äœ¿çšãããŸãã ããã¯ã誰ããæå·åããŒãææãããã¹ãŠã®ãã¹ã¯ãŒãã解èªã§ããããšãæå³ããŸãã ããã«ãæå·åããŒãšJWTç§å¯ããŒã®éã«äžé©åãªé¢ä¿ããããŸãã
- ããã§ã¯ããã¹ã¯ãŒãã¹ãã¢ã®ããŒã¿ãæå·åããããã«ãAES-256-CTRã¢ã«ãŽãªãºã ã䜿çšãããŸãã AESã¯ãŸã£ãã䜿çšããªãã§ãã ããããã®ãªãã·ã§ã³ã¯äœãå€æŽããŸããã ãã®ã¢ã«ãŽãªãºã ãéžã°ããçç±ã¯ããããŸããããããã ããæå·åãããããŒã¿ãè匱ã«ããŸã ã
ãã... Googleã«æ»ã£ãŠãããã«ãã¥ãŒããªã¢ã«ãæ¢ããŸãããã scotch.ioãªãœãŒã¹ã¯ããã¹ããŒãããŒã«ã«ããã¥ã¢ã«ã§ããã¹ã¯ãŒãã®ä¿åã«é¢ããŠãã°ãããä»äºãã ãç¬èªã®ã¢ã€ãã¢ãåã«ç¡èŠã ããã¹ã¯ãŒãããã¬ãŒã³ããã¹ãã§æ°ããäŸã«ä¿åããŸãã
ãã ãããã®ã¬ã€ãã«ãã£ã³ã¹ãäžããããšã«ããŸãããããã¡ã³ãã³ããŒããŠè²Œãä»ããããšã¯ãå§ãã§ããŸããã ããã¯ãJWTã§Mongoose ãŠãŒã¶ãŒãªããžã§ã¯ããã·ãªã¢ã«åãããšããèå³æ·±ãæ©èœãåå ã§ãã
ãã®ã¬ã€ãã®ãªããžããªãè€è£œããæ瀺ã«åŸã£ãŠã¢ããªã±ãŒã·ã§ã³ããããã€ããŠå®è¡ããŸãã Mongooseãã
DeprecationWarning
ãããã€ãå®è¡ããåŸã
http://localhost:8080/setup
ã¢ã¯ã»ã¹ããŠãŠãŒã¶ãŒãäœæã§ããŸãã 次ã«ãè³æ Œæ å ±ãNick Cerminaraããšãpasswordãã
/api/authenticate
ã«éä¿¡ãããšãããŒã¯ã³ãåãåããPostmanã§è¡šç€ºããŸãã
scotch.ioããã¥ã¢ã«ã«èšèŒãããŠããããã°ã©ã ããååŸããJWTããŒã¯ã³
JWTããŒã¯ã³ã¯çœ²åãããŠããŸãããæå·åãããŠããªãããšã«æ³šæããŠãã ããã ããã¯ã2ç¹éã®å€§ããªãã€ããªããŒã¿ãBase64ãšã³ã³ãŒããªããžã§ã¯ãã§ããããšãæå³ããŸãã ç§ãã¡ã¯ããã«ããããã³ãŒãããèå³æ·±ãäœããç§ãã¡ã®åã«éããŸãã
ãã¬ãŒã³ããã¹ããã¹ã¯ãŒããããåªããŠããå¯èœæ§ããããã®
ããŒã¯ã³ãæã£ãŠãã人ã¯ãæéåãã®ãã®ã§ãã£ãŠãããŠãŒã¶ãŒãã¹ã¯ãŒããæã¡ãåæã«Mongooseã¢ãã«ã«ä¿åãããŠããä»ã®ãã¹ãŠã®ãã®ãæã£ãŠããŸãã ããŒã¯ã³ãHTTPçµç±ã§éä¿¡ãããå Žåãéåžžã®ã¹ããã¡ãŒã䜿çšããŠããŒã¯ã³ãææã§ããŸãã
å¥ã®ã¬ã€ãã¯ã©ãã§ããïŒ åå¿è åãã«èšèšãããŠãããExpressãPassportãããã³JWTã䜿çšããèªèšŒå°çšã§ãã æ å ±æŒããã«é¢é£ããåãè匱æ§ããããŸãã SlatePeakã®ã¹ã¿ãŒãã¢ããã«ãã£ãŠäœæããã次ã®ã¬ã€ãã¯ãåãã·ãªã¢ã«åãè¡ããŸãã ãã®æç¹ã§ãæ€çŽ¢ãåæ¢ããŸããã
4çªç®ã®ãšã©ãŒïŒèªèšŒã®è©Šè¡åæ°ãå¶éãã
ã¬ãã¥ãŒããããã¥ã¢ã«ã®ãããã«ããèªèšŒã®è©Šè¡åæ°ãå¶éããããã¢ã«ãŠã³ãããããã¯ãããããããšã«ã€ããŠèšåããŠããŸããã§ããã
èªèšŒã®è©Šè¡åæ°ãå¶éããããšãªããæ»æè ã¯ãäŸãã°Burp Intruderã䜿çšããŠã匱ããã¹ã¯ãŒããæã€ã¢ã«ãŠã³ãã«ã¢ã¯ã»ã¹ããããšãæãã§ããªã³ã©ã€ã³èŸæžæ»æãå®è¡ã§ããŸãã ã¢ã«ãŠã³ãããã¯ã¢ãŠãã¯ã次åãã°ã€ã³ãããšãã«è¿œå æ å ±ãå ¥åããå¿ èŠãããããããã®åé¡ã®è§£æ±ºã«ã圹ç«ã¡ãŸãã
èªèšŒã®è©Šè¡åæ°ãå¶éãããšããµãŒãã¹ã®å¯çšæ§ãåäžããããšã«æ³šæããŠãã ããã ãã®ãããbcryptã䜿çšãããšãããã»ããµã«æ·±å»ãªè² è·ãããããŸãã å¶éãªãã«ãbcryptãåŒã³åºãããé¢æ°ã¯ãç¹ã«é«ãåŽåéçŽçãªèŠå ã䜿çšããå Žåãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ãµãŒãã¹æåŠã®ãã¯ãã«ã«ãªããŸãã ãã®çµæããŠãŒã¶ãŒç»é²ãŸãã¯ãã¹ã¯ãŒãæ€èšŒã䜿çšããŠã·ã¹ãã ã«å ¥ãããã®å€ãã®èŠæ±ãåŠçãããšããµãŒããŒã«é«ãè² è·ãããããŸãã
ãã®ãããã¯ã«é¢ããé©åãªãã¥ãŒããªã¢ã«ã¯ãããŸãããã express-rate-limit ã express-limiter ã express-bruteãªã©ãã¯ãšãªã®æ°ãå¶éããå€ãã®ãã«ããŒã©ã€ãã©ãªããããŸãã ãããã®ã¢ãžã¥ãŒã«ã®ã»ãã¥ãªãã£ã¬ãã«ã«ã€ããŠè©±ãããšã¯ã§ããŸããããå匷ããããŸããã§ããã äžè¬ã«ãå®çšŒåã·ã¹ãã ã§ãªããŒã¹ãããã·ã䜿çšãããªã¯ãšã¹ãæ°ã®å¶éã®åŠçãnginxãŸãã¯ãã®ä»ã®ããŒããã©ã³ãµãŒã«æž¡ãããšããå§ãããŸãã
çµè«ïŒèªèšŒã¯ç°¡åãªäœæ¥ã§ã¯ãããŸãã
ã»ãšãã©ã®å Žåããã¬ãŒãã³ã°ããã¥ã¢ã«ã®äœæè ã¯ããããã¯åºæ¬ã®èª¬æã§ãïŒ èª°ãæ¬çªç°å¢ã§ããã䜿çšããªããšç¢ºä¿¡ããŠããŸãïŒã ãããããããã®èšèãçå®ã§ã¯ãªãããšãææããããåŸãŸããã ããã¯ããã¬ãŒãã³ã°ããã¥ã¢ã«ã«ã³ãŒããå«ãŸããŠããå Žåã«ç¹ã«åœãŠã¯ãŸããŸãã 人ã ã¯ãããã¥ã¢ã«ãèªã人ãããã¯ããã«å€ãã®çµéšãæã£ãŠããããã¥ã¢ã«ã®èè ã®èšèãä¿¡ããŠããŸãã
ããªããåå¿è ãªãããã¥ãŒããªã¢ã«ãä¿¡çšããªãã§ãã ããã ãã®ãããªè³æããã³ãŒããã³ããŒããŠè²Œãä»ãããšã確å®ã«ããªããããªãã®äŒç€ŸããããŠããªãã®é¡§å®¢ãNode.jsèªèšŒã®åéã®åé¡ã«ã€ãªãããŸãã ä¿¡é Œæ§ãé«ããããã«äœ¿çšã§ããæ¬çªã®å æ¬çãªèªèšŒã©ã€ãã©ãªãæ¬åœã«å¿ èŠãªå Žåã¯ã䜿çšã«äŸ¿å©ãªãã®ãããå®å®ããŠãããæéã®çµéãšãšãã«ãã¹ãããããã®ãèŠãŠãã ããã ããšãã°ãRails / Deviseã®æã§ã
Node.jsãšã³ã·ã¹ãã ã¯ããã®ã¢ã¯ã»ã·ããªãã£ã«ãããããããå®éã®åé¡ã解決ããããã«Webã¢ããªã±ãŒã·ã§ã³ãç·æ¥ã«äœæããå¿ èŠãããJSéçºè ã«ãšã£ãŠå€ãã®å±éºããããããŸãã ããªãã®äœéšãããã³ããšã³ãã«éå®ãããŠããŠãJavaScript以å€ã®ç¥èããªãå Žåã¯ãåæ§ã®ãœãªã¥ãŒã·ã§ã³ããŒãããããã°ã©ãã³ã°ããŠè¶³ãæããªãæ¹æ³ãããã«åŠã¶ããããRubyã䜿ãã巚人ã®è©ã«ç«ã€æ¹ãç°¡åã ãšå人çã«ç¢ºä¿¡ããŠããŸãããŒãã
ãã¥ãŒããªã¢ã«ã®äœæè ã§ããå Žåã¯ãç¹ã«ãã³ãã¬ãŒãã³ãŒããæŽæ°ããŠãã ããã ãã®ã³ãŒãã¯å®çšŒåã«å ¥ããŸãã
ä¿¡é Œã§ããNode.jséçºè ã§ããã°ãç§ã®è©±ã§ãPassportããŒã¹ã®èªèšŒã·ã¹ãã ã§äœããã¹ãã§ãªããã«ã€ããŠãäœã圹ã«ç«ã€ãã®ãèŠã€ããŠããã ããã°å¹žãã§ãã 確ãã«ãããªãããã§ã«ãã®ãããªã·ã¹ãã ãæã£ãŠãããªãããã®äžã®äœããééã£ãŠè¡ãããŠããŸãã ç§ã®è³æããã¹ãŠã®å¯èœãªèªèšŒãšã©ãŒãã«ããŒããŠãããšèšã£ãŠããã®ã§ã¯ãããŸããã Expressã¢ããªã±ãŒã·ã§ã³ã®èªèšŒã·ã¹ãã ã®äœæã¯ãç¹å®ã®ãããžã§ã¯ãã®ãã¹ãŠã®åŸ®åŠãªç¹ãç解ããŠããéçºè ã®ã¿ã¹ã¯ã§ãã ãã®çµæã圌ã¯é«å質ã§ä¿¡é Œã§ããäœããæã«å ¥ããã¹ãã§ãã Node.jsã§Webã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£åé¡ã«ã€ããŠè°è«ãããå Žåã¯ãTwitterã§ã¡ãã»ãŒãžãéã£ãŠãã ãã ã
ãã®åºçç©ã®èè ã¯ã8æ7æ¥ã«RisingStackã®ä»£è¡šè ããé£çµ¡ããã£ããšå ±åããŠããŸãã 圌ãã¯ã圌ãã®ãã¬ãŒãã³ã°ããã¥ã¢ã«ããã¹ã¯ãŒããå¹³æã§ä¿åããªããšå ±åããŸããã çŸåšãã³ãŒããšããã¥ã¢ã«ã§ã¯ãbcryptã䜿çšããŠããŸãã
ããã«ã圌ã¯èªåã®çŽ æã«é¢ãããã£ãŒãããã¯ã«è§ŠçºãããŠãã®ããã¥ã¡ã³ããäœæããŸããã ãã®ããã¥ã¡ã³ãã§ã¯ãNode.jsã®èªèšŒåéããæé«ã®ãã®ãåéããã€ããã§ãã
芪æãªãèªè ïŒ Node.jsã«åºã¥ããWebã¢ããªã±ãŒã·ã§ã³ã§ã®èªèšŒã·ã¹ãã ã®çµç¹ã«ã€ããŠã¯ã©ãæããŸããïŒ