App Service または Azure Functions アプリを、Appleでサインインするプロバイダーを使用してサインインできるように構成する (プレビュー)

この記事では、認証プロバイダーとして Sign in with Apple を使用するように、Azure App Service または Azure Functions を構成する方法について説明します。

この記事の手順を完了するには、Apple 開発者プログラムに登録する必要があります。 Apple Developer Program に登録するには、developer.apple.com/programs/enroll に移動します。

注意事項

Apple でサインインを有効にすると、Azure portal、Azure CLI、Azure PowerShell などの一部のクライアントを使用して、アプリケーションの App Service の認証と承認機能の管理が無効になります。 この機能は新しい API サーフェスに依存しています。プレビュー期間中は、すべての管理エクスペリエンスではまだ考慮されていません。

Apple Developer ポータルでアプリケーションを作成する

Apple Developer ポータルでアプリ ID とサービス ID を作成します。

  1. Apple Developer ポータルで、[Certificates, Identifiers, & Profiles]\(証明書、ID、プロファイル\) に移動します。

  2. [Identifiers](ID) タブで、 [+] ボタンを選択します。

  3. [Register a New Identifier](新しい ID の登録) ページで、 [App IDs](アプリ ID) を選び、 [Continue](続行) を選択します アプリ ID には、1 つ以上のサービス ID が含まれます。

    スクリーンショットは、Apple 開発者ポータルの [Register a New Identifier]\(新しい識別子の登録\) ページを示し、アプリ ID が強調表示されています。

  4. [ アプリ ID の登録 ] ページで、説明とバンドル ID を指定します。

  5. 機能の一覧から、[ Apple でサインイン してから 続行] を選択します。 この手順で 、アプリ ID プレフィックス (チーム ID) を 書き留めます。 この情報は後で必要になります。

    Apple 開発者ポータルでの新しいアプリ識別子の構成を示すスクリーンショット。

  6. アプリの登録情報を確認し、 [Register](登録) を選択します。

  7. ここでも、 [Identifiers](ID) タブで [+] ボタンを選択します。

    スクリーンショットは、Apple 開発者ポータルでプラス アイコンが強調表示されている [識別子] ページを示しています。

  8. [Register a New Identifier](新しい ID の登録) ページで、 [Services IDs](サービス ID) を選び、 [Continue](続行) を選択します。

    [サービス ID] が強調表示されている Apple 開発者ポータルの [新しい識別子の登録] ページを示すスクリーンショット。

  9. [Register a Services ID](サービス ID の登録) ページで、説明と識別子を入力します。 次に、 [構成] を選択します。

    説明と識別子を指定するスクリーンショット。

    説明は、ユーザーが同意画面に表示する内容です。 識別子は、App Service で Apple プロバイダーを構成するときに使用するクライアント ID です。

  10. ダイアログで、プライマリ アプリ ID を先ほど作成したアプリ ID に設定します。 ドメイン セクションでアプリケーションのドメインを指定します。 リターン URL には、<app-url>/.auth/login/apple/callback URL を使用します。 たとえば、「 https://contoso.azurewebsites.net/.auth/login/apple/callback 」のように入力します。 その後、 [Add](追加)[Save](保存) の順に選択します。

    登録のドメインとリターン URL の指定を示すスクリーンショット。

  11. サービス登録情報を確認し、[ 保存] を選択します。

クライアント シークレットを生成する

Apple では、アプリ開発者がクライアント シークレット値として JSON Web トークン (JWT) を作成して署名する必要があります。 このシークレットを生成するには、まず、Apple Developer ポータルから楕円曲線の秘密キーを生成してダウンロードします。 その後、そのキーを使用し、特定のペイロードを使って JWT に署名します。

秘密キーを作成してダウンロードする

  1. Apple Developer ポータルの [Keys](キー) タブで、 [Create a key](キーの作成) を選ぶか、 [+] ボタンを選択します。
  2. [ 新しいキーの登録 ] ページで、キーに名前を付け、[ Apple でサインイン] を選択し、[ 構成] を選択します。
  3. [Configure Key](キーの構成) ページで、前に作成したプライマリ アプリ ID にキーをリンクし、 [Save](保存) を選択します。
  4. 情報を確認し、[続行] を選択して、キーの作成を完了 します。 次に、情報を確認し、[ 登録] を選択します。
  5. [Download Your Key](自分のキーのダウンロード) ページで、キーをダウンロードします。 .p8 (PKCS#8) ファイルとしてダウンロードされます。 ファイルの内容を使用して、クライアント シークレット JWT に署名します。

クライアント シークレット JWT を構成する

Apple では、クライアント シークレットが JWT の base64 エンコードである必要があります。 デコードされた JWT には、次の例のようなペイロードが構成されている必要があります。

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: Apple クライアント ID は、サービス ID としても使用されます
  • iss: ご利用の Apple Developer Team ID
  • aud: Apple でトークンが受信されるため、それらが対象ユーザーとなります
  • exp:nbf から 6 か月以内

このペイロードの base64 でエンコードされたバージョンは次のようになります。

eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

注記

Apple では、作成日 ( nbf) から 6 か月以上経過した有効期限のクライアント シークレット JWT は受け入れられません。 少なくとも 6 か月ごとにクライアント シークレットをローテーションする必要があります。

トークンの生成と検証の詳細については、 Apple の開発者向けドキュメントを参照してください

クライアント シークレット JWT に署名する

前にダウンロードした .p8 ファイルを使用して、クライアント シークレット JWT に署名します。 このファイルは、PEM 形式の秘密署名キーを含む PKCS#8 ファイル です。 JWT の作成と署名に使用できるライブラリは多数あります。

JWT の作成と署名には、オンラインで使用できるさまざまな種類のオープン ソース ライブラリがあります。 JWT の生成の詳細については、「 JSON Web トークン (JWT)」を参照してください。

たとえば、クライアント シークレットを生成する 1 つの方法は、 Microsoft.IdentityModel.Tokens NuGet パッケージ をインポートし、次に示す C# コードを実行することです。

using Microsoft.IdentityModel.Tokens;

public static string GetAppleClientSecret(string teamId, string clientId, string keyId, string p8key)
{
    string audience = "https://appleid.apple.com";

    string issuer = teamId;
    string subject = clientId;
    string kid = keyId;

    IList<Claim> claims = new List<Claim> {
        new Claim ("sub", subject)
    };

    CngKey cngKey = CngKey.Import(Convert.FromBase64String(p8key), CngKeyBlobFormat.Pkcs8PrivateBlob);

    SigningCredentials signingCred = new SigningCredentials(
        new ECDsaSecurityKey(new ECDsaCng(cngKey)),
        SecurityAlgorithms.EcdsaSha256
    );

    JwtSecurityToken token = new JwtSecurityToken(
        issuer,
        audience,
        claims,
        DateTime.Now,
        DateTime.Now.AddDays(180),
        signingCred
    );
    token.Header.Add("kid", kid);
    token.Header.Remove("typ");

    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

    return tokenHandler.WriteToken(token);
}
  • teamId: ご利用の Apple Developer Team ID
  • clientId: Apple クライアント ID、サービス ID
  • p8key: PEM 形式のキー。 キーを取得するには、テキスト エディターで .p8 ファイルを開き、改行なしで -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- の間のすべてをコピーします。
  • keyId: ダウンロードされたキーの ID

返されるこのトークンは、Apple プロバイダーの構成に使用するクライアント シークレット値です。

重要

クライアント シークレットは、重要なセキュリティ資格情報です。 このシークレットを他のユーザーと共有したり、クライアント アプリケーションで配布したりしないでください。

選択した設定名を使用して、クライアント シークレットをアプリのアプリケーション設定として追加します。 後で使用するためにこの名前をメモしておきます。

アプリケーションにプロバイダー情報を追加する

注記

必要な構成は新しい API 形式ですが、現時点では ファイルベースの構成 (プレビュー) でのみサポートされています。 このようなファイルを使用するには、ここでの手順に従う必要があります。

このセクションでは、新しい IDP を含むように構成を更新する方法について説明します。 構成の例を次に示します。

  1. identityProviders オブジェクトに、apple オブジェクトがまだ存在しない場合は追加します。

  2. オブジェクトを registration オブジェクトが含まれているそのキーに割り当て、オプションで login オブジェクトを割り当てます。

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    
  3. registration オブジェクトで、clientIdを収集したクライアント ID に設定します。

  4. registration オブジェクトで、clientSecretSettingNameクライアント シークレットを格納したアプリケーション設定の名前を設定します。

  5. login オブジェクトでは、scopes電子メールなど、Apple で認証するときに使用されるスコープの一覧を含むように配列を設定できます。 スコープが構成されている場合、ユーザーが初めてサインインするときに、同意画面で明示的に要求されます。

この構成を設定すると、Apple プロバイダーを使用してアプリの認証を行う準備が整います。

完全な構成は次の例のようになります。APPLE_GENERATED_CLIENT_SECRET設定は、生成された JWT を含むアプリケーション設定を指しています。

{
    "platform": {
        "enabled": true
    },
    "globalValidation": {
        "redirectToProvider": "apple",
        "unauthenticatedClientAction": "RedirectToLoginPage"
    },
    "identityProviders": {
        "apple": {
            "registration": {
                "clientId": "com.contoso.example.client",
                "clientSecretSettingName": "APPLE_GENERATED_CLIENT_SECRET"
            },
            "login": {
                "scopes": []
            }
        }
    },
    "login": {
        "tokenStore": {
            "enabled": true
        }
    }     
}