이 문서에서는 Apple로 로그인을 인증 공급자로 사용하도록 Azure App Service 또는 Azure Functions를 구성하는 방법을 보여 줍니다.
이 문서의 절차를 완료하려면 Apple 개발자 프로그램에 등록해야 합니다. Apple 개발자 프로그램에 등록하려면 developer.apple.com/programs/enroll로 이동합니다.
주의
Apple에서 로그인을 사용하도록 설정하면 Azure Portal, Azure CLI 및 Azure PowerShell과 같은 일부 클라이언트를 통해 애플리케이션에 대한 App Service 인증 및 권한 부여 기능을 관리할 수 없습니다. 이 기능은 새 API 화면을 사용하며, 미리 보기 중에는 아직 모든 관리 환경에서 고려되지 않습니다.
Apple 개발자 포털에서 애플리케이션 만들기
Apple 개발자 포털에서 앱 ID 및 서비스 ID를 만듭니다.
Apple 개발자 포털에서 인증서, 식별자 및 프로필로 이동합니다.
식별자 탭에서 (+) 단추를 선택합니다.
새 식별자 등록 페이지에서 앱 ID를 선택하고 계속을 선택합니다. 앱 ID에는 하나 이상의 서비스 ID가 포함됩니다.
앱 ID 등록 페이지에서 설명 및 번들 ID를 제공합니다.
기능 목록에서 Apple로 로그인 을 선택한 다음 계속을 선택합니다. 이 단계에서 앱 ID 접두사(팀 ID) 를 기록해 둡니다. 나중에 필요합니다.
앱 등록 정보를 검토하고 등록을 선택합니다.
다시 식별자 탭에서 (+) 단추를 선택합니다.
새 식별자 등록 페이지에서 서비스 ID를 선택하고 계속을 선택합니다.
서비스 ID 등록 페이지에서 설명과 식별자를 제공합니다. 그런 다음, 구성을 선택합니다.
설명은 사용자가 동의 화면에서 보는 내용입니다. 식별자는 앱 서비스를 사용하여 Apple 공급자를 구성하는 데 사용되는 클라이언트 ID입니다.
대화 상자에서 기본 앱 ID를 이전에 만든 앱 ID로 설정합니다. 도메인 섹션에서 애플리케이션의 도메인을 지정합니다. 반환 URL의 경우
<app-url>/.auth/login/apple/callbackURL을 사용합니다. 예:https://contoso.azurewebsites.net/.auth/login/apple/callback. 그런 다음, 추가와 저장을 선택합니다.
서비스 등록 정보를 검토한 다음 저장을 선택합니다.
클라이언트 암호 생성
Apple은 앱 개발자가 JWT(JSON Web Token)를 만들고 클라이언트 비밀 값으로 서명하도록 요구합니다. 이 암호를 생성하려면 먼저 Apple 개발자 포털에서 타원 곡선 프라이빗 키를 생성하고 다운로드합니다. 그런 다음, 해당 키를 사용하여 특정 페이로드로 JWT를 서명합니다.
프라이빗 키 만들기와 다운로드
- Apple 개발자 포털의 키 탭에서 키 만들기를 선택하거나 (+) 단추를 선택합니다.
- 새 키 등록 페이지에서 키에 이름을 지정하고 Apple에서 로그인을 선택하고 구성을 선택합니다.
- 키 구성 페이지에서 이전에 만든 기본 앱 ID에 키를 연결하고 저장을 선택합니다.
- 정보를 확인하고 계속을 선택하여 키 만들기를 완료합니다. 그런 다음, 정보를 검토하고 등록을 선택합니다.
-
키 다운로드 페이지에서 키를 다운로드합니다.
.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 개발자 팀 ID
- aud: Apple이 토큰을 받고 있으므로 수신자는 Apple입니다.
- exp: nbf 후 6개월 이내
이 페이로드의 base64로 인코딩된 버전은 다음과 같습니다.
eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG
참고
Apple은 생성 후 6개월 이상 만료 날짜 또는 nbf 날짜가 있는 클라이언트 비밀 JWT를 허용하지 않습니다. 최소한 6개월마다 클라이언트 비밀 키를 갱신해야 합니다.
토큰 생성 및 유효성 검사에 대한 자세한 내용은 Apple의 개발자 설명서를 참조하세요.
클라이언트 암호 JWT 서명
이전에 다운로드한 .p8 파일을 사용하여 클라이언트 비밀 JWT에 서명합니다. 이 파일은 PEM 형식의 프라이빗 서명 키를 포함하는 PKCS#8 파일 입니다. JWT를 만들고 서명할 수 있는 많은 라이브러리가 있습니다.
JWT를 만들고 서명하기 위해 온라인으로 사용할 수 있는 다양한 종류의 오픈 소스 라이브러리가 있습니다. JWT 생성에 대한 자세한 내용은 JWT(JSON 웹 토큰)를 참조하세요.
예를 들어 클라이언트 비밀을 생성하는 한 가지 방법은 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 개발자 팀 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
}
}
}