ASP.NET MVC 3 で Dropbox の OAuth 認証を使う
執筆日時:
今回は Sharpbox を使って、Webサイトに Dropbox を利用したログイン機能を追加します。まず、 SessionController というコントローラを作成して、Create()、AuthorizationCallBack()、Delete() の3つのメソッドを作成しました。/Session/Create が /LogOn に、/Session/Delete が /LogOff にあたります*1。
ビューへ適当に @Request.IsAuthenticated を埋め込んでいるのでわかりにくいですけど、今は False 、つまりログインしていない状態です。では、 Create() から。
/Session/Create
// // GET: /Session/Create -> map route /LogOn public ActionResult Create() { string app_key = "***"; string app_secret = "***"; // 0. load the config DropBoxConfiguration config = DropBoxConfiguration .GetStandardConfiguration(); config.AuthorizationCallBack = new Uri( Request.Url, "AuthorizationCallBack"); // 1. get the request token from dropbox DropBoxRequestToken requestToken = DropBoxStorageProviderTools .GetDropBoxRequestToken(config, app_key, app_secret); // 2. build the authorization url based on request token string url = DropBoxStorageProviderTools .GetDropBoxAuthorizationUrl(config, requestToken); // 3. Redirect to the authorization page on dropbox return Redirect(url); }
面倒くさい RequestToken の作成や Callback Url の生成は DropBoxStorageProviderTools がやってくれるので簡単。あとは 生成した Callback Url へリダイレクトしてやればいいです。
/Session/AuthorizationCallBack
Dropbox の認証画面でのログインが完了すると、0. で設定した config.AuthorizationCallBack つまり AuthorizationCallBack() にリダイレクトがかかります。
public ActionResult AuthorizationCallBack() { // 4. Get oauth token and uid from Request.Form[] var oauth_token = Request["oauth_token"]; var uid = Request["uid"]; // 5. Set auth cookie if (oauth_token != null && uid != null) { FormsAuthentication.SetAuthCookie(uid, true); } return Redirect("/"); }
AuthorizationCallBack() では、まずリクエストに含まれる OAuth Token と UID を取り出します。ちゃんとこれらが取得できていれば、クッキーをセットしてログインが終了。今回はログインの成功・失敗に関わらず、"/" へリダイレクトしています。
@Request.IsAuthenticated が true に。これまたわかりにくいですが @User.Identity.Name には UID がセットされました。
/Session/Delete
// // GET: /Session/Delete -> map route /LogOff public ActionResult Delete() { FormsAuthentication.SignOut(); return Redirect("/"); }
ついでに Delete() も実装して、ログアウトできるようにしておきましょう。
こんな感じでいいのかな?
*1:あとでルーティングを追加すればいいでしょう