3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AzureWebApps上に構築したSPA+REST APIのウェブアプリにAADで認証を設定してみた

Last updated at Posted at 2021-03-09

はじめに

構成

  • フロントエンドはReactで作成し、AzureWebAppsにdeploy
  • RestAPIはPythonで作成し、AzureWebAppsにdeploy
  • フロントエンドとRestAPIのAzureWebAppsは別リソース
  • 認証・認可は、AzureADを使用

やりたいこと

  • AADで認証済みのユーザーのみウェブアプリにアクセスしてRestAPIも実行できる

この記事では扱わないこと

  • WebAppsへのアプリのdeployは出来ている前提とする
  • Static Web Appsは使わない
  • API Managementは使わない

やったこと

フロントエンド側に認証設定

  • フロントエンド側のWebAppsのコンソールからApp Service認証を「オン」にして、Azure Active Directoryを選択します
    スクリーンショット 2021-03-09 9.18.57.png
  • 細かい設定は後回しにして、簡易モードで認証設定します
    スクリーンショット 2021-03-09 9.23.26.png

単純な認証は、これだけでOKです。
ブラウザからWebアプリを開くと、AADでの認証を求められます。
スクリーンショット 2021-03-09 10.12.35.png

RestAPI側に認証設定

  • フロントエンド側同様に、RestAPI側もWebAppsのコンソールからApp Service認証を「オン」にして、Azure Active Directoryを選択します
  • 詳細モードに切り替えて、クライアントID、発行者のURL、クライアントシークレットを入力してください
    • この値はフロントエンド側の同じ画面(AADの設定の詳細モード)を開いて、コピーしてください
      • そうすることで、フロントエンド側と同じ認証情報でRestAPIを呼び出すことができます
        スクリーンショット 2021-03-09 9.32.40.png

とりあえず、これで、コンソールから認証の設定ができました。

APIを呼び出す

  • 認証を設定した状態ですと、何もしなければAPI呼び出しが401エラーになります
  • access_tokenAuthorizationヘッダーにつけることで、APIを呼び出すことが出来ます
  • access_tokenは、フロントエンド側で認証後に.auth/meにアクセスすることで取得可能です

access_tokenを 更新する

  • .auth/meから取れるtokenは、残念ながら有効期限が切れても更新されません
  • 更新するには、.auth/refreshを呼び出してください
  • ただし、何も設定をしないと、うまく更新されてくれませんでした。下記の設定が必要だと思われます。
    • Azure Resource Explore( https://resources.azure.com ) を開く
    • フロントエンド側のWeb Appsのリソースの認証設定にたどり着く
      • subscriptions > ** <subscription_name** > resourceGroups > **_ <resource_group_name> ** > providers > Microsoft.Web > sites > ** <app_name>** > config > authsettings
    • additionalLoginParamsを下記のように書き換える。<app_id> はAADのアプリクライアントID
      • "additionalLoginParams": ["response_type=code id_token", "resource=<app_id>"]
  • このあたり、よく分かってないので間違えているかもしれません。Azureのドキュメントを貼っておくので、そちらを読み解いてもらえればと。

431エラーを回避する

  • ここまでで問題なく動けばOKですが、431エラーが出ることがあります。
  • 認証設定によりヘッダーが追加されて、ヘッダー長が長すぎることが原因です。
  • 環境変数で WEBSITE_AUTH_DISABLE_IDENTITY_FLOW=trueを設定することで回避出来ます。
  • これも正直良くわかってないです。Azure OSS Developer Supportに記事があったので、そちらを参照してください。

まとめ

AzureWebApps上に構築したSPA+REST APIのウェブアプリにAADで認証を設定できた

必要な設定

  • コンソールからフロントエンド側のWebAppsに認証を設定
  • コンソールからRestAPI側のWebAppsにも認証を設定
  • https://resources.azure.com から、トークンの更新の設定
  • 環境変数にWEBSITE_AUTH_DISABLE_IDENTITY_FLOW=trueをセット

APIを呼び出す時にやること

  • .auth/refreshを呼び出してtokenを更新
  • .auth/meを呼び出してaccess_tokenを取得
  • access_tokenを使用して、APIを呼び出す

お試しで書いてみたAPI呼び出しのコードです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?