ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure App Service / Functions で OpenID Connect を試す

f:id:horihiro:20200725205239p:plain Azure App Service が OpenID Connect による認証を (プレビューですが) サポートしたので、試してみました。
# といっても、元ネタは、Azure Functions の PM である Anthony Chu の下記ブログに書いてある内容で、ほぼ「追試」です。

dev.to

公式ドキュメントはこちら。

docs.microsoft.com docs.microsoft.com

Auth0 側の設定

  1. Auth0 にログインして、アプリケーションを作成する f:id:horihiro:20200725182426p:plain

  2. 作成したアプリケーションから、下記の 3 つの情報をコピーする

    • Client Id
    • Client Secret f:id:horihiro:20200725183729p:plain
    • Open ID Configuration 用 Endpoint ( Advanced Settings から取得可能です) f:id:horihiro:20200725182807p:plain
  3. Application URIs のうち下記項目を設定する

    • Application Login URI
      -> https://<app-name>.azurewebsites.net/.auth/login/auth0
    • Application Callback URLs
      -> https://<app-name>.azurewebsites.net/.auth/login/auth0/callback
    • Application Logout URLs
      -> https://<app-name>.azurewebsites.net/.auth/logout f:id:horihiro:20200725183426p:plain
  4. アプリケーションを保存します。

App Service 側の設定

# Azure Functions も同じです

  1. アプリケーション設定を追加する
    今回は下記のような名称で作成します。
    • 名前:
      AUTH0_CLIENT_SECRET
    • 値:
      <Auth0 の Client Secret> f:id:horihiro:20200725194016p:plain
  2. 認証設定を有効化する
    元ブログでは Azure CLI (az rest) でプロパティを更新していますが、Azure Resource Explorer から対象の App Service の config/authsettings を直接書き換えることも可能です。 f:id:horihiro:20200725194359p:plain
  3. 設定ファイルを作成する
    D:\home\site\wwwroot に、下記の設定ファイルを作成します。
    認証設定の有効化 (上記 2. )で、authFilePathauth.json と設定したので、設定ファイルのパスは D:\home\site\wwwroot\auth.json となります
{
  "platform": {
    "enabled": true
  },
  "globalValidation": {
    "redirectToProvider": "auth0",
    "unauthenticatedClientAction": "RedirectToLoginPage"
  },
  "identityProviders": {
    "openIdConnectProviders": {
      "auth0": {
        "registration": {
          "clientId": "<Auth0 の Client ID>",
          "clientCredential": {
            "secretSettingName": "AUTH0_CLIENT_SECRET"
          },
          "openIdConnectConfiguration": {
            "wellKnownOpenIdConfiguration": "<Auth0 の Open ID Configuration 用 Endpoint>"
          }
        },
        "login": {
          "nameClaimType": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",
          "scope": [ "openid", "profile", "email" ],
          "loginParameterNames": []
        }
      }
    }
  },
  "login": {
    "tokenStore": {
      "enabled": true
    }
  }
}

上の json の うち、secretSettingName には 1. で Client Secret を入れるために作成したアプリケーション設定の名前 (AUTH0_CLIENT_SECRET) を指定します。

試してみる

認証に関する情報はリクエスト ヘッダーに入ってくるので、下のような HTTP トリガー関数で (だいぶ雑に) 確認してみます

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    context.res = {
        status: 200,
        body: req.headers
    };
}

ブラウザーからアクセスしてみると、Auth0 のログイン画面にリダイレクトされるので、その画面でサインアップかログインすると、リクエスト ヘッダーがブラウザー上に表示されます。

f:id:horihiro:20200725204712p:plain

x-ms-client-principal‐*x-ms-token-auth0-* などのヘッダーが付与されているのが確認できます。

注意

どうやら、2020 年 7 月 26 日時点では、Azure Functions では、isAuthFromFile"true" を設定すると、Azure ポータルから各関数コードへのアクセスに失敗します。

f:id:horihiro:20200725210047p:plain

Azure ポータルから関数コードを編集している場合 (運用環境ではお勧めしませんが) は、編集前に一時的に isAuthFromFile"false" に直す必要がありそうです。
プレビュー期間中の制限だとは思いますが、ご注意ください。

あとドキュメントによって、scope だったり loginScopes だったりするのですが、たぶん scope が正しいです。

f:id:horihiro:20200726091317p:plain f:id:horihiro:20200726091250p:plain

追記:もう PR もありました。

github.com