플러그인 포크를 최신 omniauth-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 게엠에 약간의 작업을 추가하면 수정될 수 있을 것 같습니다.
하지만 여전히 이름/이메일을 받을 수 없는 상태이므로, 이 다른 문제들을 수정하는 것이 가치가 있는지 확신이 서지 않습니다 ![]()