Apple login 사용해보기
https://developer.apple.com/kr/news/?id=09122019b
준비사항
https://developer.apple.com/account 에서 필요한 정보를 알 수 있습니다.
- Apple ID Prefix는 Team ID 입니다.
- Bundle ID는 ClientId 입니다.
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}
확인사항 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필드로 유저를 구분할 수 있습니다.
참고