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も作成したことがわかりました...

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


All Articles