@David, the author of the PR has responded to my comment, what’s your opinion on this?:
Me:
This PR appears to solve the issue with the lack of name and email?
PR Author:
No, unfortunately not. Apple needs to provide a REST API endpoint to retrieve name/email as they currently only pass this information upon successful authentication once and not on subsequent authentications.
Isn’t one-time at initial Authorisation good enough for us?
It’s better than nothing, but it’s still not good. For example, if you “sign in with apple”, but then click cancel on the “create account” screen. Or if you connect an existing account with apple, then decide to create a new account instead. Hopefully Apple will resolve that before the end of the beta
현재 시점에 Sign in with Apple 기능이 정상적으로 작동하는 구현 예가 있나요? 마켓플레이스 관련 작업을 진행 중인 사이트에서 iOS 앱을 출시할 계획인데, 이 옵션이 없으면 앱 가이드라인 위반으로 앱이 거부되지 않도록 다른 인증 옵션을 활성화할 수 없습니다.
저는 이 기능에 대한 큰 지지자입니다. 다른 로그인 옵션처럼 바닐라 Discourse에 기본적으로 포함되기를 바랍니다.
저는 의도적으로 그런 정보를 가져올 수 없다고 생각합니다.
앱 또는 웹사이트에 Apple로 로그인 버튼을 표시하면 사용자는 이미 보유한 Apple ID를 사용하여 탭 한 번으로 로그인 또는 가입할 수 있으며, 양식 작성, 이메일 주소 확인, 비밀번호 선택을 생략할 수 있습니다. Apple로 로그인은 사용자가 신뢰할 수 있는 일관된 로그인 경험과 여러 계정과 비밀번호를 기억할 필요가 없는 편의성을 제공하면서, 앱과 웹사이트에 간단하고 빠르게 로그인할 수 있는 새로운 방식의 프라이버시를 제공합니다. 이름과 이메일 주소를 요청하는 경우를 제외하고, 사용자는 이메일 주소를 비공개로 유지하고 대신 고유한 무작위 이메일 주소를 공유할 수 있는 옵션을 가집니다.
Robert/merefield의 플러그인 포크를 부분적으로 작동시키는 데 성공했습니다(해당 포크는 GitHub의 최신 소스에서 빌드한 omniauth gem의 사본으로 전환하는 것만 포함합니다). 그러나 제 테스트 Discourse(ngrok을 통해 끝에서 끝까지 HTTPS를 사용하는 환경)에서는 인증이 작동하려면 동일한 사이트 쿠키 Site Setting을 (없음)으로 설정해야 했습니다. 해당 설정을 비활성화하면 계정 생성(가입 양식을 닫았을 경우에도)이 가능하고 다시 로그인할 수도 있지만, 설정이 활성화된 상태에서는 다시 로그인할 수 없습니다.
여러분 중 이 사이트 설정을 비활성화하지 않아도 플러그인의 핵심 기능이 작동하도록 플러그인을 다시 작성할 수 있는지/어떻게 해야 하는지에 대한 제안을 주실 분이 있을까요? 제 플러그인 코드는 https://github.com/sau226dev/discourse-sign-in-with-apple 에 있으며, omniauth gem을 재빌드하는 데 사용한 최신 코드는 같은 GitHub 조직 내에 있어야 합니다.
플러그인은 원래 어느 정도 기능은 했었지만, 위에서 David가 설명한 문제로 인해 최근에는 관리가 이루어지지 않았습니다.
Apple이 그 근본적인 장애 요소(모든 로그인 시도에 이름과 이메일을 전송하는 문제)를 해결했다는 긍정적인 소식이 들어오기까지는 이 코드를 유지보수하는 것이 가치가 없다고 생각합니다(imho). 이 문제를 우회할 수 있는 방법이 있다고 생각하지 않습니다. 그래서 의존성 업데이트조차 시도하지 않았습니다. 어쨌든 플러그인은 테스트를 통과하지 못했을 것입니다.
따라서 이것은 ‘출판된’ 플러그인이 아닙니다(그렇지 않았다면 이 주제나 유사한 주제가 #customization:plugin에 있을 것입니다). 또한 해당 문제가 해결될 때까지 지원이 이루어질 가능성은 낮습니다. 만약 그 문제가 해결되고 Apple이 해당 정보를 제공하게 된다면, 플러그인을 마무리하는 데 기꺼이 참여하겠습니다.
그 외에도 또 하나의 중요한 문제가 있습니다(btw): 자신의 사이트에서 이를 사용하려면 Apple Developer Programme에 비용을 지불하고 가입하여 Apple 시스템 설정에 접근할 수 있어야 합니다. 무료 또는 저렴한 가입이 아니기 때문에, 이는 많은 저예산 사이트들을 주저하게 만들 것으로 예상됩니다.
@orenwolf (이후 로그인 시 이메일/이름이 반환되지 않는 문제)은 문제가 아닌 것 같습니다. 가입 창을 닫은 후 올바른 정보를 전달하여 가입을 재개할 수 있었습니다. 앞서 말씀드린 것처럼, 이후 Apple 로그인도 바로 문제없이 성공했습니다.
제가 겪은 유일한 문제는 위에서 언급한 사이트 설정을 비활성화하지 않으면 CSRF 오류가 발생하는 것이었습니다. 잠재적인 문제로는 로그인 양식에 이름 항목이 없고, 사용자 이름이 이메일의 @ 기호 앞 부분으로 설정되는 점이 있습니다(그러나 제 생각에는 이러한 잠재적 문제는 문제가 되지 않거나 사용자가 쉽게 수정할 수 있습니다).
위에서 David가 남긴 댓글 외에도, Apple 개발자 지원 사이트에서 관련 주제를 발견했는데, 해당 주제에는 이 문제를 확인해 주는 공식 답변이 달려 있었습니다:
공식 답변:
Hi aslkdjalksdjasdasd,
This behaves correctly, user info is only sent in the ASAuthorizationAppleIDCredential upon initial user sign up. Subsequent logins to your app using Sign In with Apple with the same account do not share any user info and will only return a user identifier in the ASAuthorizationAppleIDCredential. It is recommened that you securely cache the initial ASAuthorizationAppleIDCredential containing the user info until you can validate that an account has succesfully been created on your server.
Patrick
한 개발자가 이렇게 댓글을 달았습니다:
잠깐… 만약 Apple로부터의 첫 번째 리다이렉트가 매우 흔한 여러 가지 이유 중 하나로 인해 유실되면, 사용자의 정보를 다시 가져올 다른 방법이 없으므로 해당 사용자를 영구적으로 잃게 되는 건가요? 이 정보를 가져올 다른 방법이 정말 없는 건가요?
또 다른 개발자는 이렇게 말했습니다:
아니면 다운스트림에서 문제가 발생하면 고객들이 불만을 제기하고, 지원팀에서 Apple ID 웹사이트에 들어가서 권한을 철회하도록 안내하여 다시 올바르게 등록할 수 있게 할 것입니다. 이런 종류의 문제가 발생하기 시작하면 이 로그인 메커니즘을 사용하지 않게 될 것이며, 이는 매우 나쁜 경험이 될 것이라고 생각합니다.
따라서 안타깝게도 이 방식을 프로덕션 환경에서 안전하게 사용할 수 없다고 생각합니다. 이건 지원팀의 _지옥_이 될 것입니다.
Apple이 그들이 만든 문제에 눈을 뜰 때까지 이 주제를 잠깐 보류하는 것을 제안합니다. 보안 개선을 시도하는 과정에서 견고성을 지나치게 희생한 것 같습니다.
Apple은 콜백에서 POST 요청을 사용하고 있습니다. OAuth 구현에서 이는 흔하지 않으며, samesite=Lax 쿠키가 요청과 함께 전송되지 않는다는 것을 의미합니다. 즉, Discourse는 콜백 동안 세션 쿠키를 읽을 수 없으므로 CSRF 오류가 발생합니다.
안전하지 않은 우회 방법은 Discourse 쿠키를 samesite=None으로 변경하여 이 보안 설정을 비활성화하는 것입니다.
CSRF 토큰 없이 POST 요청을 사용하는 것은 코어 내의 또 다른 보안 조치도 트리거합니다.
omniauth 게엠이 JWK를 가져오는 동안 Apple에서 403 오류가 발생했습니다. Accept: 헤더가 올바르게 설정되지 않고 있다고 의심하지만, 아직 확인은 하지 못했습니다.
안전하지 않은 우회 방법은 키를 하드코딩하는 것이었습니다.
모든 과정을 거친 후, 마침내 Apple로 로그인하는 데 성공했습니다. https://sandbox.dtaylor.uk에서 직접 테스트해 볼 수 있습니다. (몇 일 동안 작동하게 두겠지만, 안전하지 않은 환경이므로 민감한 정보를 입력하지 마세요.)
그런데… 이메일/이름은 여전히 첫 번째 인증 시에만 포함됩니다. 이걸 테스트해 볼 수 있습니다 - Apple로 로그인한 후 계정 생성을 취소하고 다시 시도해 보세요. 두 번째 시도 시에는 사용자 정보가 누락됩니다.
즉, Apple이 당분간 방식을 변경하지 않을 것이라면… 어떻게 하면 이 문제를 해결할 수 있을까요?
(1)과 (2)에 대해서는 보안에 해를 끼치지 않으면서 Apple의 POST 요청을 GET 요청으로 변환할 수 있다고 생각합니다. 콜백에서 POST 요청을 받으면 window.location='/auth/apple/callback?code=...&state=...'을 설정하는 JavaScript를 렌더링합니다. 그러면 그 이후부터는 다른 제공자와 똑같이 작동하게 됩니다. 다만, POST 요청을 가로채려면 코어 API에 몇 가지 변경 사항이 필요할 것 같습니다.
(3)에 대해서는 omniauth 게엠에 약간의 작업을 추가하면 수정될 수 있을 것 같습니다.
하지만 여전히 이름/이메일을 받을 수 없는 상태이므로, 이 다른 문제들을 수정하는 것이 가치가 있는지 확신이 서지 않습니다