読者です 読者をやめる 読者になる 読者になる

なか日記

一度きりの人生、楽しく生きよう。

CoreTweetでPINコード使わずにTwitter認証する方法

CoreTweetでOAuthを使った認証をするサンプルが見当たらなかったのでブログに書いておきます。

個人的な経緯

Webサイトに何かメッセージを投稿すると同時にその内容をツイートをさせたい場合、どうするのが良いでしょう。

このウインドウを使えば簡単(そう)ですが、内容を変更できてしまうのでちょっと違う気がします。

f:id:nakaji999:20140919030054p:plain

結果、Webサイト(アプリケーション)を認証してもらって、メッセージの投稿から一連の流れでツイートさせるのが良いんじゃないかという結論に至りました。

そこで、以前書いたASP.NET Identityを使ってツイートする記事を使えば良いかなとも思ったのですが、この方法だとサイトに「ユーザー登録してもらわないといけない」ので利用する側としてはお手軽じゃないと思います。

結論:CoreTweetを使ってアプリを認証しよう

結局、CoreTweetを使ってTwitter認証する仕組みを実装することにしました。

実装サンプル

というわけで、サンプルコードです。

事前準備として、Twitter Application ManagementサイトにてTwitterアプリケーションの登録が必要です。その辺はググってもらうかBingってもらえればいろいろ情報が出てくると思いますので割愛します。

CoreTweetのインストールはパッケージマネージャコンソールからInstall-Package CoreTeweetで行えます。簡単ですね。

認証ページの呼び出し

登録したTwitterアプリケーション用に発行されたAPIキーとAPIキーシークレットを使用して、OAuthSessionインスタンスを取得します。

この時、認証完了後にリダイレクトするURLを指定します。このパラメータを指定しなかった場合、認証後にPINコードが表示されます。

また、このインスタンスに格納されている情報が後々必要になるので、セッション情報へ格納しておきます。

そして、認証ページにリダイレクトします。

public class AuthController : Controller
{
    public ActionResult Twitter(HomeIndexViewModel model)
    {
        var oAuthSession = OAuth.Authorize("{TwitterApiKey}", "{TwitterApiKeySecret}",
                                        "http://mydomain.com:63543/AuthCallback/Twitter");

        // セッション情報にOAuthSessionの内容を保存
        Session["OAuthSession"] = oAuthSession;

        return Redirect(session.AuthorizeUri.OriginalString);
    }
}

認証ページ

見慣れたこんな画面にリダイレクトされるので「連携アプリを認証」します。

すると、事前に指定したURLへリダイレクトされます。

f:id:nakaji999:20140921025738p:plain

リダイレクト先でアクセストークンの取得

リダイレクト時にパラメータとして oauth_token と oauth_verifier が渡されます。

トークンを取得する際、認証ページのURLを取得した際の情報と oauth_verifier を使用します。

public class AuthCallbackController : Controller
{
    public ActionResult Twitter(string oauth_token, string oauth_verifier)
    {
        // OAuthSessionインスタンスを復元
        var oAuthSession = Session["OAuthSession"] as OAuth.OAuthSession;
    
        var token = session.GetTokens(oauth_verifier);

        // token から AccessToken と AccessTokenSecret を永続化しておくとか、
        // セッション情報に格納しておけば毎回認証しなくて良いかも

        return Redirect("~/");
    }
}

あとがき

これだけのことするのに結構時間を食ってしまいました。言葉では「OAuth使って認証すれば良いじゃん」のひと言で済みますが、いざやってみるとわかっていない事がいろいろと明確になってきます。

しかし、そのおかげで次からはさくさくっと手が動く訳ですから、やはりいろいろ手を動かしとかないとなぁと感じた1週間でした(おい

追記(2016/08/05)

上のサンプルコードではSession使ってましたけど、TempData使った方がいいと思います。

TempDataもセッション情報使ってデータを保持しますが、基本的に一度読み出したらセッション情報からは削除されます。無駄なリソースをいつまでも保持しない方が気持ち良いですよね。