おぼえがき・その3 †今更だけど.Net Framework2.0 Form認証にOpenIDを…(・∀・;) †…まずできるのか?ってところからスタート… その前に認証APIとか †OpenID…仕様読んでみたけど(´∀`)誰か翻訳して…って状態でとまどりそう。 はてなの場合 // はてな認証API protected void Page_Load(object sender, EventArgs e) { //ReturnUrl取得 //認証ページはWebconfigのauthenticationで設定しているのでこんな取り方。 //おそらくここにもはてなからのコールバックを考慮する必要があるかと。 string redurl = FormsAuthentication.GetRedirectUrl(this.UserName.Text, false).ToString(); //はてなAPI用リンク文字列生成 //パラメタ名は小文字のみっぽい。 string AuthUrl = "http://auth.hatena.ne.jp/auth?api_key=はてなからもらったAPIキー" + "&returl" + System.Web.HttpUtility.UrlDecode(redurl).ToString(); + "&api_sig="; //シグニチャ生成 string AuthSig = "はてなからもらったパス値"; //連結する他のシグニチャはalpha順に //api_key以外のパラメタは少ないので手動。 AuthSig += "api_key" + "はてなからもらったAPIキー"; AuthSig += "returl" + System.Web.HttpUtility.UrlDecode(redurl).ToString(); //MD5hexに変換 //まずMD5 ASCIIでバイト変換すると巧く行く… byte[] authsigbit = UnicodeEncoding.ASCII.GetBytes(AuthSig); System.Security.Cryptography.MD5CryptoServiceProvider hsalgo = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] md5sig = hsalgo.ComputeHash(authsigbit.Length); //MD5→hexへ System.Text.StringBuilder result = new System.Text.StringBuilder(); foreach (byte bits in md5sig){ result.Append(bits.ToString("x2")); } string HashStr = result.ToString(); AuthUrl += HashStr; //画面UIにセット。 //HatenaLoginLinkはHyperLink。 this.HatenaLoginLink.NavigateUrl = AuthUrl; //はてな認証APIからの戻りは同じくPage_Loadになるはず。 //同ページにPost_Back(ボタンクリックとか)があるので… if (this.Page.IsPostBack) { //こういう書き方は多分… } else { //はてなからのコールバックを判定するのがこのパラメタ。 if (this.Page.Request.QueryString.GetValues("cert") != null && this.Page.Request.QueryString["cert"].Length > 0) { //certを取得 string AuthCert = this.Page.Request.QueryString["cert"].ToString(); //ReturnUrlを取得 string ReturnUrl = ""; if (this.Page.Request.QueryString.GetValues("returl") != null && this.Page.Request.QueryString["returl"].Length > 0) { ReturnUrl = this.Page.Request.QueryString["returl"].ToString(); } else { //ReturnUrlが無かった時にトップページを表示。 ReturnUrl = "トップページURL"; } //はてなからログイン情報を取得するためのリクエスト文字列 string AuthCertUrl = "http://auth.hatena.ne.jp/api/auth.xml?" + "api_key=はてなからもらったAPIキー" + "&cert=" + AuthCert + "&api_sig="; //シグニチャ string AuthCertSig = "はてなからもらったパス値" + "api_key=はてなからもらったAPIキー" + "cert=" + AuthCert //MD5hex変換 // 〜前述と同じなので中略〜 //HashCertStrにMD5hex文字列をセット。 //リクエスト文字列完成。 AuthCertUrl += HashCertStr; //HTTP GET リクエストを投げて… WebRequest req = WebRequest.Create(AuthCertUrl); req.Method = "GET"; req.Timeout = 1000; //XMLで取得。 StreamReader sr = new StreamReader(req.GetResponse().GetResponseStream()); //はてなから受け取ったストリーム(XML)を読めるようにする XmlDocument xml = new XmlDocument(); xml.Load(sr); //読み込んだXMLのリーダーを生成 XmlNodeReader xrder = new XmlNodeReader(xml); //エラー情報があるか探す。 xrder.ReadToFollowing("has_error"); try { //エラーがなければ制限ページへリダイレクト。 if (String.Equals("false", xrder.ReadString())) { sr.Dispose(); FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("ユーザー名とか", false, 5000); FormsAuthentication.SetAuthCookie("ユーザー名とか", false); this.Page.Response.Redirect(ReturnUrl); } else { //エラー内容を表示 xrder.ReadToFollowing("message"); this.MsgOpen.Text = xrder.ReadString() + ", Invalid credentials. Please try again."; sr.Dispose(); } } catch { //XMLを読むのに失敗した時の処理。 this.MsgOpen.Text = xrder.ReadString() + ", Invalid credentials. Please try again."; sr.Dispose(); } } } }
Form認証のIDやパスを発行… †発行手続き実装(不採用の予定)に当たってイロイロ調べていると (続く)
EOF |