2013年10月26日土曜日

[WAAD]OAuth で WebAPI を保護する ③

前回、前々回に引き続き Windows Azure Active Directory(WAAD)の OAuth 2.0 で WebAPI を保護する方法を紹介します。

これまでのポスト
 [WAAD]OAuth で WebAPI を保護する ①
 [WAAD]OAuth で WebAPI を保護する ②


前回までで環境は整ったので、今回は実際にアクセスしてみます。(今回でようやく終わりです)

◆作業の流れ
これまでの作業の流れは以下の通りです。今回は最後の 7 を実行します。


  1. WebAPI の作成:今回は ASP.NET MVC4 の WebAPI を使います
  2. WebAPI の保護:WAAD を使って認可する様に設定を行います
  3. WebAPI を WAAD に登録:WAAD の保護対象リソースとして WAAD へ登録します
  4. OAuth クライアントの作成:本来は真面目にクライアントも作るのですが、今回は生の動きを見るために Chrome Extension の Advanced REST Client とダミー URL を使います
  5. OAuth クライアントを WAAD に登録:WAAD を使うアプリケーションとして OAuth クライアントを登録します
  6. WebAPI へのアクセス許可設定:OAuth クライアントが WebAPI へアクセスできるように設定します
  7. 動作確認:実際に OAuth2.0 のフローに従ってアクセスできるかどうかテストします。(今回は認可コードフローを試してみます)



◆実際の作業

7.動作確認

実際に OAuth クライアントから WebAPI へアクセスします。OAuth の認可コードフローを使って WAAD からアクセスに必要なアクセストークンを取得するので、まずは OAuth クライアントの client_id と client_secret を確認します。
クライアント ID(client_id)は 管理ポータルのアプリケーションの構成の中にありますが、client_secret は初期状態では生成されていません。そこでキーの項目で有効期限を選んで生成をします。尚、作成後ページ遷移をするとそのキーは二度と参照できなくなるので、必ずコピーしておきます。万一忘れてしまった場合は再度キーを生成します。




これで実際にアクセスするための準備はすべて終了です。
もう一度おさらいですが、今回やりたいことをシーケンスに表わすと以下のような流れになります。



上記のシーケンスの通り、まずは WAAD の 認可エンドポイントへリクエストを投げます。

※今回はクライアントを作らずにブラウザと Chrome Extension の Advanced REST Client を使うので、リソースオーナー(ユーザ)がクライアントへアクセスしてきたと仮定して、クライアントがリソースオーナーへリダイレクトしてくる認可要求を手動で実行します。

投げるリクエストは以下の通りです。

・メソッド:GET
・エンドポイント:
 https://login.windows.net/common/oauth2/authorize?api-version=1.0
・パラメータ
 response_type : code
 client_id : 先に取得した Client の client_id

実際はブラウザから以下の URL へアクセスします。
 https://login.windows.net/common/oauth2/authorize?api-version=1.0&response_type=code&client_id=[client_id]


すると、WAAD の認可エンドポイントから認証要求が返ってきますので、WAAD 上に登録した組織のアカウントでログインします。(フローの①)


認証が通ると、再度認可エンドポイントへ遷移し、設定がうまくいっていれば認可コードが払い出されます。
クライアントがダミー(WAAD に登録したアドレスが適当に http://localhost)なので、ブラウザにはエラーが表示されますが、アドレスバーを見るとちゃんとコードがパラメータに入っていることがわかります。
これが上記フローの②に該当します。


これで認可コードが取得できたので、次は WAAD のトークンエンドポイントで認可コードとアクセストークンを交換してもらいます。
今度は POST メソッドを使うので Advanced REST Client を使います。

投げるリクエストは以下の通りです。

・メソッド:POST
・エンドポイント:
 https://login.windows.net/common/oauth2/token
・フォームデータ
 grant_type : authorization_code
 client_id : 先に取得した Client の client_id
 client_secret : 先に取得した Client の client_secret
 code : 取得したcode
 resource : WebAPI の URI(WAAD に登録した URI)


こんな感じで投げます。


うまくいけば HTTP 200 が返ってきて、結果にアクセストークンが返ってきます。フローの④の部分です。(ついでに id_token も返ってきてます)


ようやくこれで WebAPI へアクセスする準備が整いました。
あとは単純に、このアクセストークンを Authorization ヘッダにセットして WebAPI の URI へリクエストを投げるだけです。

投げるリクエストは以下の通りです。実際のアクセストークンの前に「Bearer 」を入れるのを忘れないでください。

・メソッド:GET
・エンドポイント:
 http://localhost:52941/Api/Values
・ヘッダ
 Authorization : Bearer [取得したアクセストークン]

こんな感じです。上記フローの⑤に当たります。


前々回で保護設定をした状態では HTTP 401 が返ってきていましたが、今回はちゃんと HTTP 200 が返ってきます。
データも取得できているようです。



いかがでしょうか?
概念的に OAuth2.0 を使ってリソースを保護する、と言うだけなら簡単なのですが、実際にステップ毎に実行してみると理解ができると思います。
また、Visual Studio 2013 からは OWIN という新しい認証の実装が入ってきていますが、内部的にはこんな感じで動いています(たぶん)。

参考)Understanding OWIN Forms authentication in MVC 5




0 件のコメント: