【覚書】Auth認証を作る

 

Twitter から UserStream API の廃止が行われていますが、リアルタイムにツイートを取得する必要性が少ないのか、それほどの混乱にはなっていない。

代替えはいろいろ出ていますがどうにも使い勝手が悪い。

そこまでリアルタイムにこだわりがあるわけではない。実際に、ツイートが、”2分”遅れたとして、何か困る事象になるのだろうか?
もし、それほどリアルタイムにこだわる必要があるサービスの提供を考えるのなら、Twitter という選択肢を選ばないだろう。確かに、不特定多数に同時に情報を発信するという概念から言えば、Twitter は優秀なプラットフォームだと思う。

話が横道にそれてしまったが、利用規約やAPI仕様変更の多さから毛嫌いされることが多い Twitter ですが、当然の事だと受け入れて、できることを、できる範囲で楽しめばいいと割り切っています。

APIの仕様から、1分に一回程度は、タイムラインの取得ができるのですから、これを安全に行う方法で考えればよい。

前置きが長くなったが、C#を使って、タイムラインとDMを取得して、ユーザに通知するためだけのサービスを作る。

  • 複数アカウントに対応する
  • 5分未満で新着が把握できる
  • タイムラインの取得を行って、自分以外の投稿を知らせる
  • タイムラインを取得して、コメントが付いたら知らせる
  • DMが届いたら知らせる

ぐらいかな?

あと、画像や動画があれば認識するくらいで大丈夫かな?

ツイートもできるだろうけど、今は必要ないかな。BOTとか作るのなら必須だろうけど、Windowsフォームアプリではあまり意味がなさそうだからな。

まずは、認証部分を作ろう。
C#には、CoreTweet という強力なパッケージが用意されている。NuGet で取得しておく。

Twitterアプリのためのキーの取得は、https://apps.twitter.com/ で行っておく。電話番号認証されていないアカウントでは作成できない。

フォームアプリを作成して、メインとなる部分

        private CoreTweet.OAuth.OAuthSession session { get; set; }

を宣言する。

適当に、ボタンを二つと、テキストボックスを一つを配置して、一つのボタンを”認証”とした。そこに、

            session = CoreTweet.OAuth.Authorize(Properties.Resources.ConsumerKey, Properties.Resources.ConsumerSecret);
            var url = session.AuthorizeUri; // -> user open in browser
            frmPin mPin = new frmPin(url.ToString());
            mPin.Show();
とでも、書いておこう。
アプリキーの設定を行って、認証用のURLを取得した。

それをあらかじめ作っておいた、Webブラウザだけを張り付けたフォームに渡して起動する。単純に Shell に取得してきたURLを渡してもよいが、デフォルトブラウザで起動するのが美しくないので、別枠にした。デフォルトブラウザでは、Twitter を広げているのだろう。そうなると、ログイン状態を維持した状態にできなくなってします。

今回は、PIN の入力にしたが、ASP.NET や PHP が使えるサーバがあるのなら、認証をそっちに投げてしまって、キーだけ取得したり、コールバックを受け付ける仕組みにしてもよいとは思う。

個人的には、そのほうが美しいとは思うが、認証を行うという機能充足を考えると、PIN入力でも十分だと思われる。

PINの入力をテキストボックスに行わせた後(自分で作って、自分で使うので、エラーや細かい操作性を無視している。客に渡したり、不特定多数に使わせるのなら、PINではなく、コールバックのほうがいいのは当然である。そうなると、URLの取得から、サイト側で行う必要があり、面倒になってしまった)を、もう一つのボタンで処理を行う。

            string strPin = txtPin.Text;
            //
            var tokens = CoreTweet.OAuth.GetTokens(session, strPin);
            //
            txtAccessToken.Text = tokens.AccessToken.ToString();
            txtAccessSecret.Text = tokens.AccessTokenSecret.ToString();
別途フォームに張り付けていた、二つのテキストボックスに取得してきたトークンを張り付けているが、当然これからも永続的に使うのなら、DBに入れるなりする必要がある。
私は、今後の事も考えて、設定用のXMLでも作ろうかと思っている。
認証はこれで終わり。
あとは、取得したトークンを利用するのだが、続きはまた気になって作ったときにでも・・・