この記事では、認証プロバイダーとして 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 を作成します。
Apple Developer ポータルで、[Certificates, Identifiers, & Profiles]\(証明書、ID、プロファイル\) に移動します。
[Identifiers](ID) タブで、 [+] ボタンを選択します。
[Register a New Identifier](新しい ID の登録) ページで、 [App IDs](アプリ ID) を選び、 [Continue](続行) を選択します アプリ ID には、1 つ以上のサービス ID が含まれます。
[ アプリ ID の登録 ] ページで、説明とバンドル ID を指定します。
機能の一覧から、[ Apple でサインイン してから 続行] を選択します。 この手順で 、アプリ ID プレフィックス (チーム ID) を 書き留めます。 この情報は後で必要になります。
アプリの登録情報を確認し、 [Register](登録) を選択します。
ここでも、 [Identifiers](ID) タブで [+] ボタンを選択します。
[Register a New Identifier](新しい ID の登録) ページで、 [Services IDs](サービス ID) を選び、 [Continue](続行) を選択します。
[Register a Services ID](サービス ID の登録) ページで、説明と識別子を入力します。 次に、 [構成] を選択します。
説明は、ユーザーが同意画面に表示する内容です。 識別子は、App Service で Apple プロバイダーを構成するときに使用するクライアント ID です。
ダイアログで、プライマリ アプリ ID を先ほど作成したアプリ ID に設定します。 ドメイン セクションでアプリケーションのドメインを指定します。 リターン URL には、
<app-url>/.auth/login/apple/callbackURL を使用します。 たとえば、「https://contoso.azurewebsites.net/.auth/login/apple/callback」のように入力します。 その後、 [Add](追加) 、 [Save](保存) の順に選択します。
サービス登録情報を確認し、[ 保存] を選択します。
クライアント シークレットを生成する
Apple では、アプリ開発者がクライアント シークレット値として JSON Web トークン (JWT) を作成して署名する必要があります。 このシークレットを生成するには、まず、Apple Developer ポータルから楕円曲線の秘密キーを生成してダウンロードします。 その後、そのキーを使用し、特定のペイロードを使って JWT に署名します。
秘密キーを作成してダウンロードする
- Apple Developer ポータルの [Keys](キー) タブで、 [Create a key](キーの作成) を選ぶか、 [+] ボタンを選択します。
- [ 新しいキーの登録 ] ページで、キーに名前を付け、[ Apple でサインイン] を選択し、[ 構成] を選択します。
- [Configure Key](キーの構成) ページで、前に作成したプライマリ アプリ ID にキーをリンクし、 [Save](保存) を選択します。
- 情報を確認し、[続行] を選択して、キーの作成を完了 します。 次に、情報を確認し、[ 登録] を選択します。
-
[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 を含むように構成を更新する方法について説明します。 構成の例を次に示します。
identityProvidersオブジェクトに、appleオブジェクトがまだ存在しない場合は追加します。オブジェクトを
registrationオブジェクトが含まれているそのキーに割り当て、オプションでloginオブジェクトを割り当てます。"apple" : { "registration" : { "clientId": "<client ID>", "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" }, "login": { "scopes": [] } }registrationオブジェクトで、clientIdを収集したクライアント ID に設定します。registrationオブジェクトで、clientSecretSettingNameクライアント シークレットを格納したアプリケーション設定の名前を設定します。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
}
}
}