WebMatrix 2:OAuth でログインする(2)
執筆日時:
WebMatrix 2:OAuth でログインする - だるろぐ の続き。今回は“空のサイト”テンプレートから、OAuth によるログイン処理を書いていくことにする。まぁ、“スターターサイト”テンプレートのコードを読めば分かる人もいると思うけど、こういうのは一度自分で書いてみるに限ると思う。
NuGet で必要なものをインストール
MuGet で NuGet Gallery | Microsoft.AspNet.WebPages.OAuth 3.2.7 をインストール。
まえにやったとき(さて、WebMatrix で OAuth 認証を……Σ(゚д゚lll)ガーン - だるろぐ)はインストールできなかったのだけど、今はできるようになってる。何が悪かったのかな? ま、直ってるならいいや。
これをインストールすると、 DotNetOpenAuth を初めとする必要なライブラリも同時にインストールされる。DotNetOpenAuth 系はいろいろあってどれを入れていいのかよくわからないけれど、Microsoft WebPages OAuth library をいれておけばおっけーなのかな。
~/_AppStart.cshtml
Web サイトを初めて実行するときにロードされる ~/_AppStart.cshtml で、初期設定を行う。
@{ // いろんなところで使うので、グローバルにアクセスできるようにしとくか App.Database = "Database";// ユーザー管理用のテーブルを初期化・作成 WebSecurity.InitializeDatabaseConnection( App.Database, "UserProfile", "UserId", "UserName", autoCreateTables: true);
// Google の OAuth を使います! OAuthWebSecurity.RegisterGoogleClient(); }
WebSecurity.InitializeDatabaseConnection は以前(WebMatrix でユーザー認証機能 ―― 準備編 - だるろぐ)も使った。OAuth のときもこれを使うみたいだね。
~/Account/Login.cshtml
お次はログインフォーム。
@{ Page.Title = "ログイン";var provider = Request.Form["provider"]; }
@{ // POST のときは外部サイトの認証ページへ飛ばす
if (!provider.IsEmpty() && IsPost) { AntiForgery.Validate(); // CSRF 対策
// 外部認証サービスでの認証を行う // 成功したら ~/Account/RegisterService.cshtml を開く OAuthWebSecurity.RequestAuthentication( provider, Href("~/Account/RegisterService") );
return; } }
@{ // GET のとき(だけじゃないけど)は、 // 外部認証サービスを選択するフォームを表示する
if (OAuthWebSecurity.RegisteredClientData.Count == 0) { <p>外部認証サービスが構成されていません。</p> } else { <form method="post"> @AntiForgery.GetHtml() <p> @foreach (var client in OAuthWebSecurity.RegisteredClientData) { <button type="submit" name="provider" value="@client.AuthenticationClient.ProviderName" title="@client.DisplayName アカウントを使用してログイン"> @client.DisplayName </button> } </p> </form> } }
このボタンを押すと、
Google の認証ページに飛ぶはず。
~/Account/RegisterService.cshtml
Google での認証が成功すると、このページに着地する。まぁ、名前は好きにすればいいと思う。
@{ Page.Title = "登録"; }<dl> @foreach (var key in Request.Params.Keys) { <dt>@key</dt> <dd>@Request.Params[key.ToString()]</dd> } </dl>
今回はパラメーターを列挙するだけにしておいた。ほんとはここから
- 認証がうまくいったか
- 認証データの取り出し
- このサイトでの認証とデータベースへの登録
などを行わないといけない。外部認証サービスによって返ってくるデータは微妙に違うけれど、
- OAuthWebSecurity.VerifyAuthentication Method (Microsoft.Web.WebPages.OAuth) | Microsoft Docs
- OAuthWebSecurity.TryDeserializeProviderUserId(String, String, String) Method (Microsoft.Web.WebPages.OAuth) | Microsoft Docs
- OAuthWebSecurity.TryGetOAuthClientData(String, AuthenticationClientData) Method (Microsoft.Web.WebPages.OAuth) | Microsoft Docs
などを使うことによって、統一的に扱えるようなので安心……という感じのようだ。知らんけど。
今日のところは、ここまで。