OpenID、OAuthおよびその他の利点

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) { //    . IAuthenticationResponse response = openIdProvider.GetResponse(); // response  null,    OpenID    . if (response == null) { Identifier id; //   OpenID . if (Identifier.TryParse(userOpenId, out id)) { try { //      OpenID IAuthenticationRequest request = openIdProvider.CreateRequest(userOpenId); return request.RedirectingResponse.AsActionResult(); } catch (ProtocolException ex) { TempData["error"] = ex.Message; } } return RedirectToAction("Index", "Login"); } else { //     OpenID switch (response.Status) { //   case AuthenticationStatus.Authenticated: { TempData["id"] = response.ClaimedIdentifier; return RedirectToAction("Index", "Main"); } case AuthenticationStatus.Canceled: { TempData["message"] = "   "; return RedirectToAction("Index", "Main"); } case AuthenticationStatus.Failed: { TempData["message"] = "     ."; TempData["error"] = response.Exception.Message; return RedirectToAction("Index", "Main"); } default: { return RedirectToAction("Index", "Main"); } } } }}
      
      







今、最も重芁なこずは、远加デヌタを芁求する方法ですか FetchRequestずClaimRequestの2぀の方法がありたす。 経隓的に、次のこずがわかりたす。

  1. Googleの堎合-FetchRequestを䜿甚する必芁がありたす
  2. yandex、mailru、rambler、myopenIdの堎合-ClaimRequestを䜿甚する必芁がありたす
  3. 田舎者はLJに䜏んでいお、詳现をたったく教えたせん


FetchRequestの堎合はそうしたす。 プロバむダヌぞのリク゚ストを䜜成した埌、私たちはそれを芋぀けるこずが私たちにずっおただ興味深いこずであるこずを瀺したす。

 try { //      OpenID IAuthenticationRequest request = openIdProvider.CreateRequest(userOpenId); FetchRequest fetch = new FetchRequest(); fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Contact.Email, true)); fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.First, true)); fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Name.Last, true)); fetch.Attributes.Add(new AttributeRequest(WellKnownAttributes.Preferences.Language, true)); request.AddExtension(fetch); return request.RedirectingResponse.AsActionResult(); }
      
      







そしお、認蚌に成功した埌、次のデヌタを取埗したす。

 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 { //      OpenID IAuthenticationRequest request = openIdProvider.CreateRequest(userOpenId); ClaimsRequest claim = new ClaimsRequest(); claim.BirthDate = DemandLevel.Require; claim.Country = DemandLevel.Require; claim.Email = DemandLevel.Require; claim.FullName = DemandLevel.Require; claim.Gender = DemandLevel.Require; claim.Language = DemandLevel.Require; claim.Nickname = DemandLevel.Require; claim.PostalCode = DemandLevel.Require; claim.TimeZone = DemandLevel.Require; request.AddExtension(claim); return request.RedirectingResponse.AsActionResult(); }
      
      







そしお

 //   case AuthenticationStatus.Authenticated: { var claims = response.GetExtension<ClaimsResponse>(); if (claims != null) { string str = string.Empty; str += string.Format(" : {0} <br/>", claims.BirthDate); str += string.Format(": {0}<br/>", claims.Country); str += string.Format("Email: {0}<br/>", claims.Email); str += string.Format(" : {0}<br/>", claims.FullName); str += string.Format(": {0}<br/>", claims.Gender); str += string.Format(": {0}<br/>", claims.Language); str += string.Format(": {0}<br/>", claims.Nickname); str += string.Format(": {0}<br/>", claims.PostalCode); str += string.Format(" : {0}<br/>", claims.TimeZone); TempData["info"] = str; } TempData["id"] = response.ClaimedIdentifier; return RedirectToAction("Index", "Main"); }
      
      







たあ、すべおがスヌパヌのようですが、問題がありたす。最初の問題はRamblerからの答えです。dotNetOpenAuthは圌の答えを誀ったものずしお凊理したす。 䞀般に、openid.claimed_idおよびopenid.identityのRamblerは、仕様ぞのリンクを返したす。䞀般に、゚ラヌがあるず思われるセクションで凊理を行いたす。

 case AuthenticationStatus.Failed: { //     DoTNetOpenAuth var email = Request.Params["openid.sreg.email"]; var fullname = Request.Params["openid.sreg.fullname"]; var nickname = Request.Params["openid.sreg.nickname"]; if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(fullname) || string.IsNullOrEmpty(nickname)) { TempData["message"] = "     ."; TempData["error"] = response.Exception.Message; } else { AuthOpenID("http://id.rambler.ru/users/" + nickname, fullname); } return RedirectToAction("Index", "Main"); }
      
      







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から遞択するだけです。

 //   case AuthenticationStatus.Authenticated: { string str = string.Empty; str += string.Format("Email: {0}<br/>", Request.Params["openid.sreg.email"]); str += string.Format(" : {0}<br/>", Request.Params["openid.sreg.fullname"]); str += string.Format(": {0}<br/>", Request.Params["openid.sreg.gender"]); str += string.Format(": {0}<br/>", Request.Params["openid.sreg.nickname"]); TempData["info"] = str; TempData["id"] = response.ClaimedIdentifier; return RedirectToAction("Index", "Main"); } </code>
      
      







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぀のキヌがありたす。





私たちは皆それらを必芁ずしたす。 たた、[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も䜜成したこずがわかりたした...



All Articles