これまでのポスト
[WAAD]OAuth で WebAPI を保護する ①
[WAAD]OAuth で WebAPI を保護する ②
前回までで環境は整ったので、今回は実際にアクセスしてみます。(今回でようやく終わりです)
◆作業の流れ
これまでの作業の流れは以下の通りです。今回は最後の 7 を実行します。
- WebAPI の作成:今回は ASP.NET MVC4 の WebAPI を使います
- WebAPI の保護:WAAD を使って認可する様に設定を行います
- WebAPI を WAAD に登録:WAAD の保護対象リソースとして WAAD へ登録します
- OAuth クライアントの作成:本来は真面目にクライアントも作るのですが、今回は生の動きを見るために Chrome Extension の Advanced REST Client とダミー URL を使います
- OAuth クライアントを WAAD に登録:WAAD を使うアプリケーションとして OAuth クライアントを登録します
- WebAPI へのアクセス許可設定:OAuth クライアントが WebAPI へアクセスできるように設定します
- 動作確認:実際に 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