OpenIDãå¿
èŠãªçç±
ãã®ããã«ãªãããæ°ã«å
¥ãã®ãµã€ãã«ç§»åããå¥ã®ãµã€ããžã®ãªã³ã¯ããããèšäºã¯éåžžã«èå³æ·±ããæãéèŠã§äŸ¿å©ã§ãããWell doneïŒããªã©ã®ã³ã¡ã³ããè¿œå ããŸããã³ã¡ã³ããè¿œå ããã«ã¯ãç»é²ããŠç»é²ããå¿
èŠããããŸããåãããå§ããããã°ã€ã³ãããã¡ãŒã«ãããããäžåºŠã¡ãŒã«ããããã¹ã¯ãŒããããããäžåºŠãã¹ã¯ãŒããããã«ãŒã«ãèªã¿ãããã§çºçãããã¹ãŠã«åæããããããã³ãCaptchaãã [ç»é²]ãã¯ãªãã¯ãããšãbam-[ãã°ã€ã³]-ãããžãŒç¶æ
ã«ãªãã[ãã¹ã¯ãŒã]ã[ãã¹ã¯ãŒãã®åååŸ]ã[ã«ããã£]ã®åãã£ãŒã«ããæ¶å»ãããŸãã ããã§ããã ä»ã®ãŠãŒã¶ãŒåïŒããã¯ã¡ã€ã³ã®ãŠãŒã¶ãŒã§ã¯ãªãããæ°ã«å
¥ãã®ãŠãŒã¶ãŒã§ã¯ãããŸããïŒãå
¥åãããã¹ã¯ãŒãããã¹ã¯ãŒãïŒpostïŒãcaptchaãããã³bamãããäžåºŠå
¥åããŸãããã¹ãŠã倧äžå€«ã§ããããäžåºŠ[ã«ãŒã«ãèªã...]ãã§ãã¯ããã¯ã¹ãå¿ããŠããŸããŸããã ãŸããå°çã®èŒªãåã³ééããæçŽãç³é¹žã«åºãŠãã¢ã«ãŠã³ããã¢ã¯ãã£ãã«ããã®ã§ãèšäºã¯ã©ãã«ãããŸãããããããŠã圌ãã¯è¯ã仲éã§ã¯ãããŸãããã€ãŸãã ãããã£ãããããããã§å°çã«ã圌ãã¯ãããç¥ã£ãŠããŸãã
å®éšãè¡ãããæ°ã«å
¥ãã®ã¡ãŒã«ã§ãã¢ã¯ãã£ããŒãããšããåèªãæ€çŽ¢ããŸããããã¯ããµã€ãã«ç»é²ããéã§ãã
äžæ¹ãããªãã¯èããŸãããåçŽåããŠãç°¡åãªã³ã¡ã³ããäœæããŸãããïŒãååãããé»åã¡ãŒã«ãããã¡ãã»ãŒãžã-ãããŠããé»åã¡ãŒã«ããå
¥åããããšã¯ã§ããŸããã 3ãµæåŸãããªãã¯ããã«æ¥ãŠãããã«-ã¹ãã ïŒ OK ãããŠæ³šæïŒïŒïŒ-ç»é²ãå
¥åããŠ...ããïŒ
ãããããããŸãïŒäžæ³ïŒïŒ-OpenIDã
ç§ã¯ç解ãå§ããŸããã OpenIDã®ä»çµã¿
ã«é¢ããèšäºã次ã«ç€ºããŸãã OpenIDãããã€ããŒãClaimedIdentifierãWebãµã€ãã«éä¿¡ããã ãã§ããã®å Žåã¯
andriy-chernikov.myopenid.comã®ããã«èŠããŸããã
æ®å¿µãªããšã« ãäžéšãåãåã£ãŠandriy-chernikovãéžæã§ããŸãã ç§ãã¡ã¯ç¶ããŸããç§ãã¡ã¯äž»åŒµããŸã-éåžžã®äººã¯Gmailã䜿çšããã°ãŒã°ã«ãOpenIDãæã£ãŠããŸããç§ã®ClaimedIdentifierïŒFriendlyIdentifierForDisplayã¯ãŸã£ããããŒã«ããã¯ãããããã«ã¯ååãå«ãŸããŠããŸããïŒã®ã¿ã次ã®ããã«ãªããŸãïŒ
www.google.com/accounts/o8/idïŒ ã
ãããã«ã¡ã¯ãAItOawl7JUIQLXJf1Z_x1MoYu21XbfBuzvorisoãç§ãã¡ã®ãµã€ãã§ãäŒãã§ããŠããããã§ãã
-äœããã©ããããããèãããªãã OpenIdèå¥åã«å ããŠãé»åã¡ãŒã«ã§ãä»ã®ããŒã¿ããªã¯ãšã¹ãã§ããããšãããããŸããïŒ ããŠãããªãã¯ç解ããŠããŸããããªãã¡ æœåšçã«ãŠãŒã¶ãŒããWell doneïŒ ããã§ã®ã¿ãããããªãã®ããã«æ©èœããããã¯IEçšã§ãããããã§ããªãã¯èªè»¢è»ãçºæããŸãããããªãã¯ãã®ãããªã©ã€ãã©ãªãèŠãå¿
èŠããããŸããããããã«ã€ããŠãã®ãªã³ã¯ã§éåžžã«ããŸãæãããŸãããç§ã¯åœŒãæžãããšãã§ããŸãããšãŠãæè¬ããŠããŸããã ãµã€ãïŒåœŒã®ã¡ãŒã«ãç¥ã£ãŠããïŒã«åœŒã«éç¥ãéä¿¡ããããã®äººã¯3ãæåã«æ®ãããã³ã¡ã³ããæçšã§ãã£ãããšãç解ããåãã§ããŸãã ããã«ããç解ã®ãšããããã®ã¡ãŒã«ã¯ç¢ºèªæžã¿ã§ããããã確èªããå¿
èŠã¯ãããŸããã
äžè¬çã«ãã¿ã¹ã¯ïŒ
ãŠãŒã¶ãŒãç»é²ããŠããªãããšã確èªããŠãã ããããã¿ã³ãã¯ãªãã¯ããã ãã§ãèªåã«é¢ããæ
å ±ãæäŸãããç»é²ãããŸããã³ã¡ã³ããæ®ããããè©äŸ¡ïŒããšãã°ãZOJCHã«æ祚ïŒããããã¹ãããŒã暪ã«ç§»åãããã§ããŸãã
Openid
ãŸãããããã€ããŒãéžæããŸãã GoogleãYandexãMailRuãRamblerãLivejournalãMyOpenIDã«ãªããŸãã ç§ã®æèŠã§ã¯ããããã¯ç§ãã¡ã«ãšã£ãŠæã人æ°ã®ãããµãŒãã¹ã§ãã ïŒvkontakteãtwitterãfacebookã«ã€ããŠ-åŸã§ïŒã
OpenIDèªèšŒã®ãªã³ã¯ïŒ
èš±å¯ããããµã€ãã®ãªã¹ãïŒãã¹ãæã«å¿
èŠã«ãªããŸãïŒïŒ
æ°ããASP.NET MVC3ãããžã§ã¯ããäœæããŸãã DotNetOpenAuthãããŠã³ããŒãããŠè¿œå ããŸãã ããããOpenIDãæã£ãŠããŸãã
OpenIDã䜿çšããŠæ¿èªçšã®ã³ã³ãããŒã©ãŒãäœæããŸãïŒãã³ãã³ãŒã[ããããšã]ãªã©ïŒïŒ
public class OpenIdController : Controller { private static OpenIdRelyingParty openIdProvider = new OpenIdRelyingParty(); public ActionResult Index(string userOpenId) {
ä»ãæãéèŠãªããšã¯ãè¿œå ããŒã¿ãèŠæ±ããæ¹æ³ã§ããïŒ FetchRequestãšClaimRequestã®2ã€ã®æ¹æ³ããããŸãã çµéšçã«ã次ã®ããšãããããŸãã
- Googleã®å Žå-FetchRequestã䜿çšããå¿
èŠããããŸã
- yandexãmailruãramblerãmyopenIdã®å Žå-ClaimRequestã䜿çšããå¿
èŠããããŸã
- ç°èè
ã¯LJã«äœãã§ããŠã詳现ããŸã£ããæããŸãã
FetchRequestã®å Žåã¯ããããŸãã ãããã€ããŒãžã®ãªã¯ãšã¹ããäœæããåŸãç§ãã¡ã¯ãããèŠã€ããããšãç§ãã¡ã«ãšã£ãŠãŸã èå³æ·±ãããšã§ããããšã瀺ããŸãã
try {
ãããŠãèªèšŒã«æåããåŸã次ã®ããŒã¿ãååŸããŸãã
case AuthenticationStatus.Authenticated: { var fetches = response.GetExtension<FetchResponse>(); if (fetches != null) { string str = string.Empty; str += string.Format("Email : {0} <br/>", fetches.Attributes[WellKnownAttributes.Contact.Email].Values[0]); str += string.Format(" : {0} <br/>", fetches.Attributes[WellKnownAttributes.Name.First].Values[0]); str += string.Format(" : {0} <br/>", fetches.Attributes[WellKnownAttributes.Name.Last].Values[0]); str += string.Format(" : {0} <br/>", fetches.Attributes[WellKnownAttributes.Preferences.Language].Values[0]); TempData["info"] = str; } TempData["id"] = response.ClaimedIdentifier; return RedirectToAction("Index", "Main"); }
ClaimsRequestãåæ§ïŒ<br/>
try {
ãããŠ
ãŸãããã¹ãŠãã¹ãŒããŒã®ããã§ãããïŒïŒïŒåé¡ããããŸããæåã®åé¡ã¯Ramblerããã®çãã§ããdotNetOpenAuthã¯åœŒã®çãã誀ã£ããã®ãšããŠåŠçããŸãã äžè¬ã«ãopenid.claimed_idããã³openid.identityã®Ramblerã¯ãä»æ§ãžã®ãªã³ã¯ãè¿ããŸããäžè¬ã«ããšã©ãŒããããšæãããã»ã¯ã·ã§ã³ã§åŠçãè¡ããŸãã
case AuthenticationStatus.Failed: {
MailRuã®åé¡ã ãšããã§ãããŒã«ã«ã«ãããµã€ãã§ã¯æ©èœããŸããã ã€ãŸã localhostã¯ãµã€ãã§ã¯ãªãããããBad Realmããšã©ãŒãã¹ããŒãããŸããããã¯ãå®éã«ã©ããã§ãµã€ããããŠã³ããŒãããããšã§æ±ºå®ãããŸãã
ç§ã¯ãŠã¯ã©ã€ãåºèº«ã§ããã¢ã¹ã¯ã¯ããã1æéæ©ãã®ã§ãå¿çèšé²ã«ã¯ããã«1æéããããŸãã åçã¯æ°ç§åŸã«ã§ã¯ãªãã1æé2ç§åŸã«åä¿¡ãããããã«èŠããŸãã ãããŠãããã¯ãšã©ãŒãšããŠæ±ãããŸãã Web.Configã«ããã€ãã®èšå®ãè¿œå ããŸãã
<configSections> <section name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection" requirePermission="false" allowLocation="true"/> </configSections> ... <dotNetOpenAuth> <messaging clockSkew="60:00:00" lifetime="10:00:00" strict="true"> <untrustedWebRequest timeout="00:10:00" readWriteTimeout="00:01:00" maximumBytesToRead="1048576" maximumRedirections="10"> ... </untrustedWebRequest> </messaging> </dotNetOpenAuth>
2çªç®ã®ãšã©ãŒã¯ãClaimResponseããã©ã¡ãŒã¿ãŒã解æããªãããšã§ãã Request.Paramsããéžæããã ãã§ãã
OpenIDã®æŠèŠ
OpenIDã«ããé«éèªèšŒããããlivejournalã®ã¿ãããã«ã¡ãŒã«ãéä¿¡ããŸããã
OAuth
äžè¬ã«ãOAuthã¯å³åº§ã«èªèšŒãããããã«ã¯èšèšãããŠããŸããã
ããã§ã¯OAuthã«ã€ããŠéåžžã«ããæžãããŠã
ãŸã ã ãã ããïŒïŒïŒèªèšŒããããŸãã䜿çšããŸãã éå§ããã«ã¯ãããŒããŒãéžæããŸãã
FacebookãTwitterãVKã
ãããã®ããããã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããå¿
èŠããããŸããããã¯ç°¡åã§ããç§ã¯ãããã©ãã§è¡ããããã瀺ãã ãã§ãïŒ
ãã®åŸãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã»ã¹èš±å¯ãåé€ããå¿
èŠããããŸãããªã³ã¯ã¯æ¬¡ã®ãšããã§ãã
Twitterããå§ããŸããã
Twitterã«ã¯ãã³ã³ã·ã¥ãŒãããŒãšã³ã³ã·ã¥ãŒãã·ãŒã¯ã¬ããããããŸããéèŠãªå€ã¯ã©ããã«é ããã誰ã«ãèŠããããªãããã«ããå¿
èŠããããŸãã
ãŸããèšå®ã§ã¯ãã³ãŒã«ããã¯URLãWebãµã€ããããã³ã¢ããªã±ãŒã·ã§ã³Webãµã€ããèšå®ããå¿
èŠããããŸãããããããªããŠãæ©èœããŸãã
ãã®åŸããã¹ãŠãç°¡åã«ãªããŸããäŸã§ã¯ãdotNetOpenAuthã«twitterãä»ããèªèšŒã®äŸããããŸããã€ãŸããèªåèªèº«ãã³ããŒããã ãã§ãã
ãã§ã€ã¹ããã¯
ãããããã§ã¯Facebookã§ã®æ¿èªã®ããã«dotNetOpenAuthã«ããOAuthãåºå®ããããã«4æé殺ããŸããã ããããããŸããããŸããã§ããã ãã®åŸãåªããã©ã€ãã©ãªãèŠã€ããŸããïŒ
http :
//facebooknet.codeplex.com/-åäœããäŸããããŸãïŒããŒã«ã«ãã¹ãã§ã¯åäœããŸããã§ãããããµã€ãã§ã¯ãã¹ãŠåé¡ãããŸããïŒã ãšããã§ãFacebookãšã®æ¹åæ§ã®ããçµ±åã«ã¯éåžžã«äŸ¿å©ã§ãã NuGetã«ãããŸãã
ãããã£ãŠãFacebookã¢ããªã±ãŒã·ã§ã³ãäœæãããšã3ã€ã®ããŒããããŸãã
- ApplicationID
- ã¢ããªã±ãŒã·ã§ã³ããŒ
- ã¢ããªã±ãŒã·ã§ã³ã·ãŒã¯ã¬ãã
ç§ãã¡ã¯çããããå¿
èŠãšããŸãã ãŸãã[Webãµã€ããµã€ãURL]ããã³[ãµã€ããã¡ã€ã³]ã¿ãã§æ§æããŸãã
http://developers.facebook.com/docs/authenticationã®ããŒãžã«ã¢ã¯ã»ã¹ããŠãããã§ã©ã®ããã«çºçãããã調ã¹ãŸãã
ã¹ããã1. ApplicationIDãæäŸããèªåã«é¢ããæ
å ±ãæäŸããããã«äŸé Œã
ãŸããã¡ãªã¿ã«ããªã¯ãšã¹ãã«scope = emailãè¿œå ããŠãå¥ã®é»åã¡ãŒã«ãæäŸãããããã«ããŸãã
graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope=email
ãŠãŒã¶ãŒãèŠãïŒ
ãŠãŒã¶ãŒãèš±å¯ãããšãã³ãŒããååŸãããŸãã ããã§ãªãå ŽåããŠãŒã¶ãŒãäœãæäŸããããªããšããerror_descriptionãååŸããŸãã
ã¹ããã2.次ã«ããã®ã³ãŒãã䜿çšããŠaccess_tokenããªã¯ãšã¹ãããŸãã
graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}
次ã«ã次ã®ãããªæååãååŸããŸãã
access_token=114782445239544|2.izExIa_6jpjjhUy3s7EDZw__.3600.1291809600-708770020|VbEE8KVlLTMygGmYwm-V08aVKgY&expired=12010
ãŸãã¯ããã©ãŒãããã§éã¶ã®ã¯éè«ççã§ãããšããJSONã®ãšã©ãŒã§ããããŸããŸãã§ãã
ã¹ããã3. access_tokenãåãåã£ããããŠãŒã¶ãŒããŒã¿ããªã¯ãšã¹ãããŸãã
graph.facebook.com/me?access_token={0}
JSON圢åŒã§ã¯ããŠãŒã¶ãŒã«é¢ããå€ãã®æ
å ±ãååŸã§ããŸãã ãã£ãïŒ
VKontakte
VKontakteã¯ããã€ãã®ããã«ãFacebookã§ã©ã®ãããªããšããããã段éçã«æžãããšãéç«ãããŠããŸããã圌ãã¯ãŠã£ãžã§ãããæäŸãããããŒã¿ã®éä¿¡å
ãæããŠãã ããããšæžããŸããã ãŠã£ãžã§ããã¯ApplicationIDãæž¡ãå¿
èŠããããããã ãã§ãã Vkontakteã¯ã¡ãŒã«ãäžåéä¿¡ããŸãããããŠãŒã¶ãŒã®ãããã£ãŒã«ç»åãšåçãžã®ãªã³ã¯ãããããããŸãã JavacriptïŒ
VK.init({ apiId: vkontakteAppId });
VK.Widgets.Auth("vk_auth", { width: "210px", authUrl: '/vkontakte' });
ãããŠãé©åãªã³ã³ãããŒã©ãŒã«ã¯æ¬¡ã®ãã®ããããŸãã
public class VkontakteController : Controller { public ActionResult Index(string first_name, string last_name, string uid) { var str = string.Empty; str += string.Format(" : {0}<br/>", first_name); str += string.Format(": {0}<br/>", last_name); TempData["info"] = str; TempData["id"] = "http://vkontakte.ru/id" + uid; return RedirectToAction("Index", "Main"); } }
ãŸãšã
ã¿ã¹ã¯ãéšåçã«è§£æ±ºããŸããã MyOpenIDãYandexãGoogleãFacebookãMailRu-äžè¬çã«ããã§ããŠããŠã¯ãŒã«ã§ãã TwitterãLivejournalãVKontakte-ã¡ãŒã«ãã¯ã©ã³ãããŸããïŒTwitterã«ã€ããŠã¯ä¿èšŒããŸããïŒã ã©ã³ãã©ãŒ-ãããã³ã«ã®å®è£
çšã§ã¯ãªãã£ãå Žåãäžè¬çã«ããè¡ãããŸãã
ããã«äŸãèŠãããšãã§ããŸãïŒ
http :
//cocosanka.ru
ãœãŒã¹ã®ããŠã³ããŒãã¯ãã¡ãïŒ
http :
//bitbucket.org/chernikov/smartauth
PSïŒLoginzaã«ã€ããŠç¥ã£ãŠããŸãã Googleã§èªèšŒããããšãããšãGoogleã¡ãŒã«ããã®é£çµ¡å
ãèŠæ±ããŸãã ç§ã¯ç¢ºãã«åŠæ³ã§ã¯ãããŸãããããªã圌ãã¯ãªãã§ããïŒ ãïŒ
PPSïŒYandexãOAuthãäœæããããšãããããŸãã...