Apple login 사용해보기

Hwangro Lee
6 min readOct 14, 2020

https://developer.apple.com/kr/news/?id=09122019b

준비사항

https://developer.apple.com/account 에서 필요한 정보를 알 수 있습니다.

Ceriticates, IDs & Profile에서 세팅정보를 알수 있습니다.
Identifiers 탭에서 본인의 identifier를 선택하세요
Apple ID Prefix = Team ID, Bundle ID = Client ID
  1. Apple ID Prefix는 Team ID 입니다.
  2. Bundle ID는 ClientId 입니다.
로그인 기능을 활성화하세요.
Keys 에서 애플 로그인을 위한 서비스를 생성하세요
key id & private key

3. Key ID 를 알수있습니다.

4. Download 버튼을 클릭하면 private key 를 다운받으실 수 있습니다.

5. client_secret을 구해보겠습니다.

sudo gem install jwt

jwt를 설치합니다.

require 'jwt'
key_file = 'private_key.p8'
team_id = 'team_id'
client_id = 'client_id'
key_id = 'key_id'
ecdsa_key = OpenSSL::PKey::EC.new IO.read key_fileheaders = {
'kid' => key_id
}
claims = {
'iss' => team_id,
'iat' => Time.now.to_i,
'exp' => Time.now.to_i + 86400*180,
'aud' => 'https://appleid.apple.com',
'sub' => client_id
}
token = JWT.encode claims, ecdsa_key, 'ES256', headersputs token

위와 같은 스크립트를 생성 후 실행해보면 client_secret을 구할 수 있습니다.

$ ruby client_secret.rb

테스트할 때에는 웹을 사용하는데 그럴때에는 Client ID 에 Bundle ID가 아닌 Group ID를 넣어주면 더욱 편하게 테스트를 할 수있습니다.

그 다음 토큰을 구하기 전에 먼저 사용자인증을 통해 code 값을 구합니다.

https://appleid.apple.com/auth/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}
redirect_url로 넘어가면서 code값을 알수 있습니다.

확인사항 1

이 부분에서 상당히 시간소모를 했습니다. Client_id가 어떤것인지 애플쪽에서 정확히 명시하지 않아 헷갈려서 다른 값을 넣었고 에러코드가 client_id 가 틀리다고 나오질 않았기 때문에 다른 부분에서 문제가 있는줄 알고 구글서치만 수시간…

이 부분에서 redirect_uri를 입력했는데도 잘 안된다면 client_id 부터 의심하세요.

확인사항 2

만약 리디렉션됐는데도 Code가 안나온다면 response_mode, scope를 파라미터로 전달했는지 확인해보세요. response_mode와 scope를 전달하면 code를 받을 수 없습니다.

확인사항 3

위 부분을 실행하면 xxx.com/?code={code} 형태로 리디렉션되며 code를 알 수 있습니다. 참고로 code는 5분간 유효한 키입니다.

이어서…

위 방법으로 code를 구했다면 이제는 Access Token을 구할 수 있습니다.

$ curl -XPOST "https://appleid.apple.com/auth/token" -H "Content-Type: application/x-www-form-urlencoded" -d "client_id={client_id}&client_secret={client_secret}&grant_type=authorization_code&code={code}" | json_pp{
"refresh_token" : "",
"expires_in" : 3600,
"id_token" : "",
"access_token" : "",
"token_type" : "Bearer"
}

id_token은 jwt로 인코딩되어있으며 https://jwt.io 에서 디코딩해서 데이터를 볼 수 있습니다.

이메일은 이메일 공유하기로 로그인한 경우 애플ID 로 보이고, 가리기를 선택한 경우 @private.appleid.com 으로 이메일이 생성되어집니다.

sub라는 필드는 하나의 애플계정의 유니크한 값이니 이메일로 유저를 구분하지 않고 sub필드로 유저를 구분할 수 있습니다.

참고

--

--