GoogleãEnvatoãªã©ã®ãšã³ã·ã¹ãã ã§ã®ãŠãŒã¶ãŒèªèšŒã¯ãã¯ã©ã€ã¢ã³ããµã€ãã«å¿ èŠãªããŒã¿ãšããŒã¯ã³ãæäŸããåå¥ã®ãµãŒãã¹ïŒ accounts.google.com ã account.envato.com ïŒãšããŠå®è£ ãããŸãã Ruby on Railsã§ã®ããã€ãã®ãããžã§ã¯ãã®éçºäžã«ãç§ã¯åæ§ã®åé¡ã«å¯ŸåŠããªããã°ãªããŸããã§ããã ç§åŠçã«- ã·ã³ã°ã«ãµã€ã³ãªã³ãŸãã¯ã·ã³ã°ã«ãµã€ã³ãªã³ ãã¯ãããžãŒ ã
å¿ èŠãªã®ã¯ãïŒ1ïŒãã¹ãŠã®çæ ç³»ãµã€ãã«å ±éã®ãµãŒãã¹ã§ãããïŒ2ïŒããã°ã€ã³+ãã¹ã¯ãŒãããªã³ã¯ã䜿çšããŠãã°ã€ã³ããããã®ãäž»ã«ç€ŸäŒçèš±å¯ã§ãã
ïŒ3ïŒãŠãŒã¶ãŒãã·ã¹ãã ã«ãã°ã€ã³ããããã®ãœãŒã·ã£ã«ãµãŒãã¹ããã®ããŒã¿ãããèªäœã«èç©ããïŒ4ïŒãã®ããŒã¿ãã¯ã©ã€ã¢ã³ããµã€ãã«æäŸãããµãŒãã¹ã
ã¿ã¹ã¯ã¯éæšæºãšåããããèå³æ·±ããã®ã§ããã ããã¯ãã¹ãŠæçšã ãå°ãæ代é ãã®èšäºããå§ãŸããŸãã-èè ã¯ãomniauth gemãšãã¯ã©ã€ã¢ã³ããµã€ãããã³ãããã€ããŒãµã€ãã§ãåãomniauthããœãŒã·ã£ã«ãããã¯ãŒã¯ãä»ããèªèšŒã®ããã®å·¥å€«ãšçµã¿åãããŠäœ¿çšââããããšãææ¡ããŸããã ãµãŒãã¹ã
ç§ã®å Žåã工倫ã¯ããŸããããŸããã§ããïŒãŠãŒã¶ãŒå+ãã¹ã¯ãŒããšçµã³ã€ããïŒã®ã§ãomniauthãå®å šã«åªå ãããŸããã ãããç§ã®å°ããªåéºã®å§ãŸãã§ãããã®éçšã§ããã®èšäºãããç解ããããšããå§ãããŸãã
äžè¬çãªã¹ããŒã
ã¯ã©ã€ã¢ã³ã ãµã€ã ã ãµã€ããããã€ããŒãããã³omnââiauthã«ã¹ã¿ã æŠç¥ã® 3ã€ã®ãããžã§ã¯ããæ€èšãããŸã ã ãªã³ã¯ã¯ãã¹ãŠgithubã§å©çšå¯èœã§ãããããã«äœ¿çšã§ããŸãã èšäºã§ã¯éèŠãªãã€ã³ãã®ã¿ãåãäžããããŸãã
ã¯ã©ã€ã¢ã³ããµã€ã
localhostïŒ4000ã§å®è¡ããŸãã
æ§é ã¯ãomniauthã䜿çšãããã¹ãŠã®ãµã€ãã®æšæºã§ãïŒ
- Gemfileã§ã¯ãomniauthãšomniauth-accountsæŠç¥ãæ¥ç¶ããŸãã
gem 'omniauth' gem 'omniauth-accounts'
- ãã³ãã«ã€ã³ã¹ããŒã«
- config / initializers / omniauth.rbã§ãåæåã³ãŒããæ¿å ¥ããŸãã
Rails.application.config.middleware.use OmniAuth::Builder do provider :accounts, ENV['ACCOUNTS_API_ID'], ENV['ACCOUNTS_API_SECRET'], client_options: { site: ENV['ACCOUNTS_API_SITE'] } end
- router.rbã§ãã³ãŒã«ããã¯ã¡ãœããã®ã«ãŒããè¿œå ããŸãã
match '/auth/:provider/callback', :to => 'auth#callback'
- ã³ã³ãããŒã©ãŒãšãã®äžã«ã³ãŒã«ããã¯ã¡ãœãããäœæããããã§request.env ['omniauth.auth']ãä»ããŠããŒã¿ãšããŒã¯ã³ãå«ãæçµããã·ã¥ãååŸããŸã
rails g controller auth --skip-assets # auth_controller.rb class AuthController < ApplicationController def callback auth_hash = request.env['omniauth.auth'] render json: auth_hash end end
æäœéãããã§ãã¹ãŠã§ãã
æŠç¥
æšæºã®oauth 2.0æŠç¥ãã掟çããomniauth-oauth2äŸåé¢ä¿ã¯ãGemspecã§æå®ãããŠããŸãã ã³ãŒãã¯ã»ãšãã©ãããŸããããèªåã§èª¿æŽããããšã¯æå³ããããŸãããå¿ èŠãªæŠç¥ã¯ãã¹ãŠåæåãã©ã¡ãŒã¿ãŒã§éä¿¡ãããŸãïŒãã®äŸã§ã¯ãç°å¢å€æ°ã®åœ¢åŒã§ïŒã ããã¯ïŒ
- ã¯ã©ã€ã¢ã³ããµã€ãã®ãµã€ããããã€ããŒã«æ¥ç¶ããããã®è³æ Œæ å ±ããŒïŒACCOUNTS_API_IDããã³ACCOUNTS_API_SECRETïŒ
- ãããã€ããŒã®ãµã€ãã¢ãã¬ã¹ACCOUNTS_API_SITE
- ãããã€ããŒãµã€ãã®èªèšŒã¢ãã¬ã¹ïŒããã©ã«ãïŒ/ authorizeïŒ..
- ...ããŒã¯ã³ïŒ/ããŒã¯ã³ïŒãååŸãã
ãã®ããŒã¿ãåãåã£ãåŸãæŠç¥ã¯ããã«ãã¹ãŠã®äœæ¥ãåŒãåããŸãã ãã ãããã®ãããç¹å®ã®ç¶æ³ã§æŠç¥ãã倱ããããå Žåãéçºäžã«äžå¿«ãªã±ãŒã¹ãçºçããå¯èœæ§ããããŸããèšç»ã©ããã«å®è£ ãç¶è¡ã§ããŸããã ç§ã¯ãã®ãããªåé¡ã«çŽé¢ããªããã°ãªãããããããã®è§£æ±ºçãèŠã€ãããŸãã-èšäºã®åŸåã§èª¬æããŸãã
ãŠã§ããµã€ããããã€ããŒ
localhostïŒ3000ã§å®è¡ããŸãã
2ã€ã®ååãçµã¿åãããŸãã
- 1ã€ã¯ãã¯ã©ã€ã¢ã³ããµã€ããšã®éä¿¡çšã§ã
- ãã1ã€ã¯ããœãŒã·ã£ã«ãµãŒãã¹ãšã®éä¿¡çšã§ãã
ãããã€ããŒãµã€ãã§ã®èªèšŒã¯ãæšæºã®omniauthæŠç¥ã䜿çšããŠè¡ãããŸãã
ã¯ã©ã€ã¢ã³ããµã€ãã§ã®èªèšŒ-ã«ã¹ã¿ã æŠç¥ã䜿çšããŸãã
å ±æãªã³ã¯-ã¢ã«ãŠã³ãïŒ
- ãããã€ããŒãµã€ãã®ãšã³ããªã¡ãœããã¯ããã«é¢é£ä»ããããŠããŸãïŒããã®ããŠã¹ããŒããŒã®ããã«ïŒ
- ã¯ã©ã€ã¢ã³ããµã€ãã®ç³è«ãšå©æéãããã«é¢é£ããŠããŸãã
ãããã€ããŒã®ãµã€ãèªèšŒãšã¢ã«ãŠã³ã管ç
ã¯ã©ã€ã¢ã³ããµã€ãã«ç»é²ãããšããFacebookãŸãã¯Twitterã®ãããã¡ã€ã«ãããå¿ èŠãªãã£ãŒã«ãã®ã»ãšãã©ã«èªåçã«å ¥åããã®ã¯æ¥œããããšã§ãã ç§ãã¡ã®ãŠã§ããµã€ããããã€ããŒã¯ã¢ã°ãªã²ãŒã¿ãŒã®åœ¹å²ãæãããŸã-ãœãŒã·ã£ã«ãããã¯ãŒã¯ãããã¹ãŠã®ããŒã¿ãéçŽãããŸãã ãµãŒãã¹ã¯1ã€ã®ã¢ã³ã±ãŒãã«èšå ¥ããŸããããã¯æåã§è£è¶³ã§ããã¯ã©ã€ã¢ã³ããµã€ãã¯ããããæ å ±ãååŸããŸãã
ãã®ãããã¯ã¯ããã§ã«Habrã®ããŒãžã«æ²èŒãããŠããŸãã æ®å¿µãªãããç§ã¯ãã®èšäºãèŠã€ããããšãã§ããŸããããç¹ã«ããµã€ãã§ã®ãœãŒã·ã£ã«èªèšŒã«é¢ããå žåçãªåé¡ã«ã€ããŠã®è³ªåãæèµ·ãããŸããã
- ã¢ã«ãŠã³ãçµ±åãªãã·ã§ã³
- ãµãŒãã¹ã§æŽæ°ãããšãã«ã¢ã«ãŠã³ãããŒã¿ãæŽæ°ãã
- 1ã€ã®ã¢ã«ãŠã³ãã«ç°ãªããµãŒãã¹ããã€ã³ãããæ©èœ
ãããã¯ãã¹ãŠããã®ã¿ã€ãã®ã·ã¹ãã ã®å žåçãªèŠä»¶ã§ãããé»åã¡ãŒã«ã§ã®é»åã¡ãŒã«éä¿¡ã®æ€èšŒ-ãã°ã€ã³+ãã¹ã¯ãŒãã«ããèªèšŒã§éçºãããåŸæ¥ã®èŠä»¶ã§ãã ãããã®èŠä»¶ãç°¡åã«æ€èšããŸãã
ã¢ã«ãŠã³ãã®çµ±å
gmail-boxãä»ããŠã·ã¹ãã ã«å ¥ããŸãããã·ã¹ãã ã¯ãgmailããã®ããŒã¿ã䜿çšããŠ1ã€ã®ã¢ã«ãŠã³ããäœæããŸããã 次åFacebookçµç±ã§ãã°ã€ã³ãããšãã·ã¹ãã ã¯åã³æ°ããã¢ã«ãŠã³ããäœæããŸããã æåŸã«ãèªåçšã®ã¢ã«ãŠã³ããäœæãããšãã«...èŠããŠãããŠãã ãã... gmailïŒ ãã¿ã³ãã¯ãªãã¯ãããšãä»åºŠã¯gmailãééããã¢ã«ãŠã³ãã1ã€ã«ããŒãžãããŸã-2ãããŒã®ããã«ïŒ..ãŸãã¯ããã§ãªã-1ã€ã®åé¡ããããŸãã ããŒã¿ã®ããŒãžã
gmailã§ç§ãã¡ã¯Alexander Polovinã§ãããfacebookã§ã¯Alex Polovinã§ãã ãŸããã¢ã«ãŠã³ãã«ã¯ã©ã®ããŒã¿ãæ®ãå¿ èŠããããŸããïŒ
ããŒãžäžã«ããã«ãããããäœãæ®ããããŠãŒã¶ãŒã«å°ããŸããïŒ ããããããã¯äœ¿ããããã®ç¹ã§éåžžã«æåããŠããŸãã-çµå±ããŠãŒã¶ãŒã¯ä»¥åã«ã¢ã¯ã»ã¹ãããµã€ãã«ã¢ã«ãŠã³ãã§ããã«å床ãã°ã€ã³ããããã«ã¢ã«ãŠã³ããããŒãžããŸãã
ç§ã®æ±ºå®ã¯ãã¢ã«ãŠã³ããã£ãŒã«ãã®è¿œå å€ãšããŠãäºåã®ãæ°ããããŒã¿ãè¿œå ããããšã§ããã å®éããã¹ãŠã®ã¢ã«ãŠã³ãããŒã¿ã¯ããã·ã¥ã«ä¿åããããã®ããã·ã¥ã¯ããŒãžåŸã«æ¬¡ã®åœ¢åŒããšãããšãã§ããŸãïŒæ¡ä»¶ä»ãtwitterããããŒã¿ãè¿œå ãã-Half AlexïŒïŒ
{ name: [' ', 'Alex Polovin', ' '], first_name: ['', 'Alex', ''], sir_name: ['', 'Polovin'], ... }
ã芧ã®ãšãããå€ã¯åãã£ãŒã«ãã®é åã«åçŽã«è¿œå ãããŸãã ãã ãããããã¯è€è£œãããŸãããTwitterã®ãHalfãã¯ãlast nameãã«è€è£œãšããŠä¿åãããŸããã§ããã
ã¯ã©ã€ã¢ã³ããµã€ãã¯åžžã«é åããæåã®å€ãåãåããŸããå¿ èŠã«å¿ããŠããŠãŒã¶ãŒã¯æåã®å Žæã«ä»»æã®å€ãé 眮ã§ããŸãã
ã¢ã«ãŠã³ãæ å ±ãæŽæ°ãã
ãœãŒã·ã£ã«ããomniauthã§å©çšå¯èœãªãã¹ãŠã®ããŒã¿ã®äžã§ã ãµãŒãã¹ã®å ŽåããŠãŒã¶ãŒã®ã¢ãã¿ãŒã¯ã»ãšãã©ã®å ŽåæŽæ°ãããŸãã ããŸãé »ç¹ã§ã¯ãªã-ããŒãžãžã®ãªã³ã¯ïŒurlsãã©ã¡ãŒã¿ãŒïŒãTwitterã®ããã¯ããŒã ãšèª¬æã ãããã«ãããã¯ã³ã¯ãªãã¯ã§ããªãã®ã¢ã«ãŠã³ããæŽæ°ãããããŸãã¯å€ããã®ãæ®ããã-çµå±ã®ãšããç¶æ³ã¯ç°ãªããŸãã ã¢ã«ãŽãªãºã ã¯ããã«æé©ã§ã-éè€ãä¿åããã«æ°ããå€ãé åã®æåŸã«æžã蟌ã¿ãŸãã
ç°ãªããµãŒãã¹ã1ã€ã®ã¢ã«ãŠã³ãã«ãªã³ã¯ãã
ããäžã®å®¶æ¿å©Šã®é¡äŒŒç©-ã·ã¹ãã ã§ã¯ãèªèšŒããŒãã«ã«ãšã³ããªãäœæãããçŸåšã®ã¢ã«ãŠã³ãã«æ·»ä»ãããŸãã å°æ¥ãããŒããã³ããŒã¿ãœãŒã¹ãšããŠäœ¿çšãããŸãã
ã¢ã«ãŠã³ããã£ãŒã«ãã®æåç·šé
ãã¹ãŠã®ãã£ãŒã«ãããœãŒã·ã£ã«ããå ¥åãããããã§ã¯ãããŸããã ãµãŒãã¹ã ãŠãŒã¶ãŒã¯ããããã€ããŒã®Webãµã€ãã®ããŒãžã§ãäžè¶³ããŠããããŒã¿ãèªåã§å ¥åã§ããå¿ èŠããããŸãã ãŸããé åå ã®å€ã亀æããã«ã¯ãäžèšã®ããã€ãã®æ®µèœã§èšåããŸããã
å®è£
ã¢ãã«
- ã¢ã«ãŠã³ã-ããŒã¿ããã·ã¥ãä¿åããŸãïŒæ å ±ïŒ
- èªèšŒ-FacebookãTwitterããŸãã¯å¥ã®ãµãŒãã¹ã§omniauthãä»ããŠå®è¡ãããèªèšŒã ãããã€ããŒã®ååãšãŠãŒã¶ãŒuidãä¿åããŸãã
Railsãæ å ±ãããã·ã¥ãšããŠç解ããããã«ãããã¹ããã£ãŒã«ãã®ã¿ã€ãã移è¡ã§æå®ãããã³ãŒããã¢ãã«ã«è¿œå ãããŸãã
serialize :info, Hash
ã¢ãã«é-1察å€ã®é¢ä¿ïŒ
# /app/models/account.rb has_many :authentications # /app/models/authentication.rb belongs_to :account
ã³ã³ãããŒã©ãŒ
AuthenticationsControllerã¯ãã¹ãŠã®èªèšŒããŒãºãã«ããŒãã次ã®ã¢ã¯ã·ã§ã³ãå«ãŸããŸãã
- authïŒ/ authïŒ-ãã°ã€ã³ãŸãã¯ãããã¡ã€ã«ããŒã¿ãæŽæ°ãããµãŒãã¹ãéžæããããŒãž
- ãã°ã¢ãŠãïŒ/ logoutïŒ-ãã°ã¢ãŠã
- ã³ãŒã«ããã¯ïŒ/ auth /ïŒãããã€ããŒ/ã³ãŒã«ããã¯ïŒ-ãã®ã¡ãœããã§ã¯ãããŒã¿ã®å ¥åãæŽæ°ãèªèšŒã®ãã€ã³ããªã©ã®äž»èŠãªäœæ¥ãè¡ãããŸãã
- failureïŒ/ auth / failureïŒ-å ¥åæã«ãçžæåŽãã§ãšã©ãŒãçºçããå Žåã«å®è¡ãããŸã
- detachïŒ/ auth / detachïŒ-çŸåšã®ã¢ã«ãŠã³ãããèªèšŒãåæããŸã
èªèšŒãµãŒãã¹ã®1ã€ãéžæãããšãomniauthã®æšæºã§ããæäœãå®è¡ãããŸããèªèšŒã®æåã®å Žåããã®äžæ žã¯ã³ãŒã«ããã¯ã¡ãœããåŒã³åºãã§ãã ç¶æ³ã«å¿ããŠã次ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- ãããã¡ã€ã«ããŒã¿ãæŽæ°ããŸã
- 2ã€ã®ç°ãªãã¢ã«ãŠã³ããããŒãžããŸã
- æ°ãããµãŒãã¹ãçŸåšã®ã¢ã«ãŠã³ãã«ãã€ã³ãããŸã
- åãã°ã€ã³ãŸãã¯ãã©ã€ããªãã°ã€ã³
ããŒã¿ããã·ã¥ã¯ãéžæãããœãŒã·ã£ã«ãããã¯ãŒã¯ã«å¿ããŠãåå¥ã®ãã©ã€ããŒãã¡ãœããget_data_hashïŒïŒã§åœ¢æãããŸãã ãµãŒãã¹ã
éè€ããããšãªãé åã®æåŸã«ããŒã¿ãè¿œå ããã«ã¯ãadd_infoã¢ãã«ã¡ãœããã䜿çšããŸãïŒé åã®çµåæäœã«åºã¥ããŠïŒã
def add_info(info) self.info.merge!(info){|key, oldval, newval| [*oldval].to_a | [*newval].to_a} end
èªèšŒadd_authenticationsããã€ã³ãããã«ã¯ïŒ
def add_authentications(authentications) self.authentications << authentications end
ãã®çµæãã»ãã·ã§ã³ã¯ãã°ã€ã³ããã¢ã«ãŠã³ãã®IDïŒã»ãã·ã§ã³[ïŒaccount_id]ïŒãä¿åããŸãã
ãã®æ®µéã®AccountsControllerã«ã¯ã次ã®ã¢ã¯ã·ã§ã³ãå«ãŸããŠããŸãã
- index-ãã©ãŒã å ã®ãŠãŒã¶ãŒãããã¡ã€ã«
- ç·šé-ã¢ã«ãŠã³ããããã¡ã€ã«ããŒã¿ã®ç·šé
- æŽæ°-ãããã¡ã€ã«ãæŽæ°ããŸãïŒç·šéããã®POSTèŠæ±ïŒ
ãŸãããã£ã«ã¿ãŒ-ãããã¯ãŒã¯äžã®ãŠãŒã¶ãŒã®ååšã®å¿ é ãã§ãã¯ïŒãã°ã€ã³ãã°ã€ã³ããŒãžãžã®ãªãã€ã¬ã¯ãä»ãïŒã
æ¬åœã«äŸ¿å©ã§æè»ãªããŒã¿å€æŽã®å¯èœæ§ãå®çŸãããã£ãã®ã§ãã ãããŠããã®ãããªã¿ã¹ã¯ã¯ãŸã æ®ã£ãŠãããå°æ¥è§£æ±ºãããã§ãããã ãããŸã§ã®ãšãããç·šéã¯2ã€ã®æ¹æ³ã§è¡ãããŸãã
- jsãç¡å¹ã«ãªã£ãŠããå Žå-YAML圢åŒã®ããã·ã¥ãæã€ããã¹ãé åããããŸã
- æå¹ã«ãããšãjsonæ§é jsoneditorã®ããžã¥ã¢ã«ãšãã£ã¿ãŒãããŒããããŸãã
ã¯ã©ã€ã¢ã³ããµã€ããšãããã€ããŒãµã€ãéã®ãªã³ã¯ã®äœæ
ãã®å Žåãæšæºçãªæ¹æ³ã¯ããããã€ããŒã®Webãµã€ãã§ãã¢ããªã±ãŒã·ã§ã³ããäœæããããšã§ãã ã¯ã©ã€ã¢ã³ããµã€ãã®ååãšã¢ãã¬ã¹ïŒãŸãã¯ãã³ãŒã«ããã¯ãªãã€ã¬ã¯ãã®ã¢ãã¬ã¹ïŒã瀺ããŸãã2ã€ã®ããŒidãšsecretãååŸããŸãã ãœãŒã·ã£ã«èªèšŒã·ã¹ãã ã®ãã©ã¡ãŒã¿ãŒã§ãããã瀺ããŸã-cmsãã©ã°ã€ã³ã§ããRailsã®gemã§ãã ãã®å ŽåãããŒã¯omniauth-ACCOUNTS_API_IDããã³ACCOUNTS_API_SECRETã«ãã£ãŠäœ¿çšãããŸãã
Webãµã€ããããã€ããŒã§ã®ã¢ããªã±ãŒã·ã§ã³ãµããŒãã®å®è£ ã¯ç°¡åã§ãã
rails g scaffold Application name:string uid:string secret:string redirect_uri:string account_id:integer rake db:migrate # account.rb has_many :applications
æ°ããã¬ã³ãŒããäœæãããšããã¢ãã«ã¯ãã®ããã®ããŒãçæããå¿ èŠããããŸãã
before_create :default_values def default_values self.uid = SecureRandom.hex(16) self.secret = SecureRandom.hex(16) end
ãããŠ-ã¢ããªã±ãŒã·ã§ã³äžã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãçŸåšã®ãŠãŒã¶ãŒã«ãã£ãŠãã£ã«ã¿ãŒãããå¿ èŠããããŸãã ããšãã°ã次ã®ä»£ããã«ïŒ
@applications = Application.all
䜿çšè ïŒ
@applications = Account.find(session[:account_id]).applications
ããã«ããŠãŒã¶ãŒããªã³ã©ã€ã³ã§ããããšã確èªããããšãäžå¯æ¬ ã§ã-ãã£ã«ã¿ãŒãé 眮ããŸãã
before_filter :check_authentication def check_authentication if !session[:account_id] redirect_to auth_path, notice: ' , .' end end
ããã»ã¹å³
èªèšŒã¯oauth 2.0ã«åºã¥ããŠããŸã-ãã®ãããã³ã«ã®åçã«ã€ããŠã¯ãããã«é¢ãããã®èšäºã§ããŸãã¯ããã§æ確ã«åŠã¶ããšãã§ããŸãã
åºçºç¹ã¯ãã¢ãã¬ã¹client-site.com/auth/accountsã§ãã Omniauthã¯ãããååŸããomniauth-accountsæŠç¥ã䜿çšããŠããããã€ããŒã®ãµã€ãã®ãµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ããŸãã
åæã«ãomniauthã¯ç¶æ ãã©ã¡ãŒã¿ãŒãçæããŸããããã¯ããããã€ããŒã1ã€ã®ã¯ã©ã€ã¢ã³ããµã€ãããã®ãªã¯ãšã¹ããšãŠãŒã¶ãŒãä»ã®ãªã¯ãšã¹ããšæ··åããªãããã«ããã®ã«åœ¹ç«ã¡ãŸãã
Webãµã€ããããã€ããŒã¯èŠæ±ãåãå ¥ãïŒæšæºã§ã¯ãprovider-site.com / authorizeã§ïŒãç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ãã®æ®µéã§ã®ãããã€ããŒã®ç®æšã¯ããŠãŒã¶ãŒãæ¿èªããã¯ã©ã€ã¢ã³ãã®ãµã€ãã§èªèšŒã®ããã®èš±å¯ãäžããããšã§ãã
ç®æšãéæããããšããªãã€ã¬ã¯ããã¯ã©ã€ã¢ã³ããµã€ãã®ã³ãŒã«ããã¯ã¡ãœããã«éä¿¡ãããããããrequest.env ['omniauth.auth']ããããã€ããŒãµã€ãããããŒã¯ã³ãšããŒã¿ãå«ãããã·ã¥ãååŸããŸãã
ãã°ã€ã³
authorizeã¡ãœããã¯ãããã»ã¹ã¹ããŒã ã§æãæãå Žæã§ãããŠãŒã¶ãŒã«èš±å¯ãäžããåã«èæ ®ãã¹ã埮åŠãªéãããããããããŸãã
çæ³çã«ã¯ïŒç¹°ãè¿ãæ¿èªãããå ŽåïŒ-次ã®æ¡ä»¶ãæºããããŸãã
- ãŠãŒã¶ãŒã¯æ¢ã«ãããã€ããŒãµã€ãã«ãã°ã€ã³ããŠããŸã
- ãŠãŒã¶ãŒã«ã¯ã以åã«ãã®ã¢ããªã±ãŒã·ã§ã³ã®èš±å¯ãæ¢ã«äžããããŠããŸã
- ãã®èš±å¯ã¯æéåãã§ã¯ãããŸãã
ãã®å ŽåããŠãŒã¶ãŒã¯ããã«ãã°ã€ã³ããã¯ã©ã€ã¢ã³ããµã€ãã®ã³ãŒã«ããã¯ã¡ãœãããžã®ãªãã€ã¬ã¯ããå®è¡ãããŸãã ãã©ã¡ãŒã¿ã¯èš±å¯ã³ãŒããšç¶æ stateãéä¿¡ããŸãã
ãããã®æ¡ä»¶ã®å°ãªããšã1ã€ãæºããããªãå Žåãæåã«åé¡ã解決ããå¿ èŠããããŸãã
- ãŠãŒã¶ãŒããããã€ããŒã®ãŠã§ããµã€ãã«ãã°ã€ã³ããŠããªãå Žåã¯ããã°ã€ã³ãããŸã
- èš±å¯ãçºè¡ãããŠããªãå Žåã¯ãäœæããŸãã
- èš±å¯ã®æéãåããŠããå Žåã¯ãèš±å¯ãåäœæããŸã
ãããã®ã¢ã¯ã·ã§ã³ã«ã¯ããµã€ããããã€ããŒããœãŒã·ã£ã«ãµã€ãã®ããã²ãŒããå«ãŸããŸãã ãµãŒãã¹ïŒãŠãŒã¶ãŒããã°ã€ã³ããå¿ èŠãããå ŽåïŒã æåŸã®çç±ãæããã«ãªããŸãã-ãã®å Žæã§ãomniauthã¯äžå¿«ãªåŽé¢ã瀺ããŠããŸãã
äºå®ãomniauthã¯ãæ¿èªã«åãæ¿ãããšãURLã«ããã€ãã®ãã©ã¡ãŒã¿ãŒãæž¡ãããããã€ããŒãµã€ãã®ã»ãã·ã§ã³ã§ããã€ãã®ãã©ã¡ãŒã¿ãŒãæå®ããŸãã ããã¯ã圌ãã³ãŒã«ããã¯ã¡ãœããã«æ£ãããªãã€ã¬ââã¯ãããããã«å¿ èŠã§ãã ãã ãããããã€ããŒãµã€ãã§çªç¶omniauthã䜿çšãããå ŽåïŒããšãã°ããœãŒã·ã£ã«ãµãŒãã¹ãä»ããŠãã°ã€ã³ããããšããå ŽåïŒãomniauthã¯ã»ãã·ã§ã³ããããŒã¿ãæ¶å»ããŸãã ãŸãããªãã€ã¬ã¯ãã¯ãšã©ãŒOmniAuth :: Strategies :: OAuth2 :: CallbackError-invalid_credentialsã§å€±æããŸãã
ãããã£ãŠããã®ãããªç¶æ³ãåé¿ããããã«ããã¹ãŠã®omniauthãã©ã¡ãŒã¿ãŒã¯ã»ãã·ã§ã³ã§æ確ã«ä¿®æ£ããããªãã€ã¬ã¯ãã®çŽåã«åŸ©å ãããŸãã
泚æïŒç»é²
ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãæ£ããéä¿¡ãããå ŽåïŒã€ãŸããèŠæ±ãomniauthããéä¿¡ãããå ŽåïŒ-çŸåšã®ã»ãã·ã§ã³ã§ã¬ã³ãŒããäœæããŸã-ã泚æãèš±å¯ããããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãä¿åããŸãã
session[:grants_orders] = Hash.new if !session[:grants_orders] session[:grants_orders].merge!( params[:client_id] => { redirect_uri: params[:redirect_uri], state: params[:state], response_type: params[:response_type], 'omniauth.params' => session['omniauth.params'], 'omniauth.origin' => session['omniauth.origin'], 'omniauth.state' => session['omniauth.state'] } )
泚æçªå·
ããã§ãã¹ãŠã®ãã§ãã¯ãå®è¡ããŸãã ãŠãŒã¶ãŒã¯ãªã³ã©ã€ã³ã§ããããªã¯ãšã¹ãã®éä¿¡å ã®ãµã€ãã«ã¢ããªã±ãŒã·ã§ã³ãç»é²ãããŠããŸãããå€ãèš±å¯ããããŸãããæå¹æéãåããŠããŸããã
- ãã¹ãŠãæ£åžžãªå Žåãããã«grantã¡ãœãããåŒã³åºããŸã
- äœããééã£ãŠããå Žåããã®ãããªèªèšŒã«å žåçãªããŒãžã衚瀺ããŸãïŒãã¢ããªã±ãŒã·ã§ã³ã¯ã¢ã«ãŠã³ããžã®ã¢ã¯ã»ã¹ãèŠæ±ããŠããŸããããèš±å¯ãããæåŠãïŒ
泚æïŒåãå ¥ãã
èš±å¯ãããã«å©çšå¯èœã§èŠä»¶ã«äžèŽããå ŽåããŸãã¯èš±å¯æ³šæããŒãžã®ãèš±å¯ããã¿ã³ãã¯ãªãã¯ããŠå®è¡ãããŸãã
- ã»ãã·ã§ã³ã«ä¿åããããã¹ãŠã®omniauthãã©ã¡ãŒã¿ãŒã埩å ããŠãã³ãŒã«ããã¯ã¡ãœããã«ãªãã€ã¬ã¯ããããšãã«omniauthã«ãã£ãŠé©åã«åŠçãããããã«ããŸã
- èš±å¯ãäœæããŠãªãã€ã¬ã¯ããã
泚æïŒæåŠ
ã¢ããªã±ãŒã·ã§ã³ããã£ã³ã»ã«ããã»ãã·ã§ã³ããåé€ããã ãã§ãã
ïŒããŒã¯ã³ãä»äž
æž¡ããããã©ã¡ãŒã¿ãŒã«åŸã£ãŠãã¢ããªã±ãŒã·ã§ã³ãšèš±å¯ãèŠã€ããŸãã ãã¹ãŠãæ£åžžã§ããå Žåãjson圢åŒã§èš±å¯ããŒã¯ã³ãçºè¡ããŸãã
ã¢ã«ãŠã³ãïŒget_info
åæã«åºã¥ããŠãããã·ã¥ãjson圢åŒã§è¿ããŸã-é åã§è¡šãããå Žåãæåã®ãã©ã¡ãŒã¿ãŒå€ã®ã¿ã
data_hash = grant.account.info hash = Hash.new hash['id'] = grant.account.id data_hash.each do |key, value| if value.kind_of?(Array) hash[key] = value[0] else hash[key] = value end end render :json => hash.to_json
ãããã«
ãœãªã¥ãŒã·ã§ã³ã¯ã·ã³ãã«ã§ããããšãå€æããŸããããã®äžã§ãå€ãã®ç¹ãæ¹åããã³æé©åã§ããŸãã çŸåšã次ã®ã¿ã¹ã¯ã®æŠèŠã瀺ãããŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã«ãå¿ èŠãªãã©ã¡ãŒã¿ãŒãæ£ç¢ºã«ç€ºãæ©äŒãäžããããšã¯å¿ é ããã³ãªãã·ã§ã³ã§ãã ãŸããå¿ èŠãªãã©ã¡ãŒã¿ãŒããŠãŒã¶ãŒã®ãããã¡ã€ã«ã«ãªãå Žå-å©æéåé ããŒãžã§çŽæ¥å ¥åããæ©äŒããŠãŒã¶ãŒã«äžããŸã
- ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®ãªã³ã¯ã§ãã°ã€ã³ãæäŸãã-omniauth-identityæŠç¥ã䜿çšããŠ
- ã¯ã©ã€ã¢ã³ããµã€ãã ãã§ãªããããã€ããŒãµã€ãã§ããã°ã¢ãŠããããã°ã¢ãŠãã¢ã¯ã·ã§ã³ãã¯ã©ã€ã¢ã³ããµã€ãã«è¿œå ããŸã
- tosonããã³get_info jsonãªã¯ãšã¹ãã§ã»ãã·ã§ã³ã倱ãããåé¡ã解決ããŸãïŒããã¯ãRailsã»ãã¥ãªãã£ã·ã¹ãã ãprotect_from_forgeryããã³verify_authenticity_tokenã«äœããã®é¢ä¿ãããããã§ãïŒ
æ¯æ¥ãã®ãããªã·ã¹ãã ãäœæããå¿ èŠã¯ãããŸãããå®éãã€ã³ã¿ãŒãããã«ã¯ããã»ã©å€ãã®ãšã³ã·ã¹ãã ãååšããªãããã§ãã GoogleãEnvatoãYandexãYahoo-ãããŠä»ã«èª°ãïŒ ããããããªãã®ãããžã§ã¯ãïŒ ãããŠããããé¢é£ãããžã§ã¯ãã«èªèšŒãå®è£ ããå¯äžã®æ¹æ³ã§ã¯ãããŸãã-CASãã¯ãããžãŒïŒããã€ãã®äŸ¿å©ãªãªã³ã¯ïŒãOpenIDïŒãããŠãªãã·ã§ã³ãšããŠåãLoginzaïŒããããŸãã ç§ãã¡èªèº«ã®habrããã³ä»ã®TMãããžã§ã¯ãã§ã¯ãäžè¬ã«ãåãµã€ãã«åå¥ã®èªèšŒã·ã¹ãã ãšç¬èªã®ãããŒãã¹ã¿ãŒãããããŸãã
SSOãéžæããçç±ã¯äœã§ããïŒ ããããããããã®éµã¯é°å²æ°ã§ãã ãããã¯ããŠãŒã¶ãŒããµã€ãã§ã¯ãªãã·ã¹ãã ã«ãã°ã€ã³ãããšãã«çµéšããææ ã§ã-倧æåã®ãCãã§ã 匷åã§å é²çãªéçºãããã·ã¹ãã ãž-ããã¯æ¬åœã«é©ãã¹ãæèŠã§ããååã