GitHub OAuth 앱은 앱당 Authorization callback URL을 하나만 등록할 수 있으므로, 스테이징과 프로덕션 도메인을 따로 운영한다면 환경마다 별도의 OAuth 앱을 만들어야 합니다.
github.com에 로그인한 뒤 오른쪽 상단의 프로필 사진을 클릭해 Settings → Developer settings → OAuth Apps로 이동합니다. 바로가기: github.com/settings/developers.
"New OAuth App"을 클릭합니다. GitHub이 네 개의 입력란을 요구합니다. 라벨은 정해져 있지만 값은 앱을 설명하는 내용이면 무엇이든 됩니다.
Application name: 사용자가 GitHub 동의 화면에서 보게 될 앱 이름을 입력합니다. Homepage URL: 배포된 앱 URL(https://<배포된-도메인>)을 입력합니다. Application description(선택): 동의 화면에 함께 표시될 한 줄 설명입니다. Authorization callback URL: 위에 표시된 DontCode 리다이렉트 URL(https://<배포된-도메인>/api/auth/oauth/callback)을 그대로 붙여넣습니다.
Google이나 카카오와 달리 GitHub OAuth 앱은 앱당 callback URL을 하나만 등록할 수 있습니다. 동일 앱에 여러 변형 URL을 추가할 수 없습니다. 스테이징과 프로덕션을 별도 도메인으로 운영한다면 OAuth 앱을 두 개 만들어 각 환경에 맞는 Client ID를 DontCode의 해당 환경에 입력하세요. DontCode 대시보드는 인증된 도메인별 리다이렉트 URL을 표시해 줍니다.
GitHub이 앱을 생성하고 해당 앱의 설정 페이지로 이동시킵니다. 페이지 상단에 Client ID가 표시되어 있습니다(20자 hex 문자열).
같은 설정 페이지의 "Client secrets" 섹션에서 "Generate a new client secret"을 클릭합니다. GitHub이 sudo 인증이나 2FA 확인을 요청할 수 있습니다. 시크릿은 한 번만 표시되며, 페이지를 벗어나면 다시 확인할 수 없으니 바로 복사해 두세요. 비밀번호처럼 취급하세요.
DontCode 프로젝트의 사용자 → 로그인 → GitHub으로 이동합니다. Client ID와 Client Secret을 각 필드에 붙여넣고 저장을 클릭합니다. 앱이 자동으로 재배포되며 GitHub 로그인 버튼은 몇 초 안에 적용됩니다.
DontCode는 매 로그인 시 user:email scope를 GitHub에 자동으로 요청합니다. 이를 통해 /user/emails에서 사용자의 인증된 기본 이메일을 가져오므로, 사용자가 GitHub 공개 프로필에서 이메일을 비공개로 설정했더라도 계정에 이메일이 반드시 부여됩니다. 별도로 설정할 필요는 없습니다.
일반적인 문제는 메인 가이드의 문제 해결 섹션도 함께 확인하세요.
GitHub은 callback URL이 한 글자도 다르지 않게 일치해야 합니다. 프로토콜(http vs https), 끝의 슬래시, 호스트를 다시 확인하세요. 배포 도메인이 바뀌었다면(커스텀 도메인 전환, 환경 변경 등) GitHub의 OAuth 앱 Authorization callback URL도 업데이트하세요. 여러 URL이 필요하다면(스테이징 + 프로덕션) 환경마다 OAuth 앱을 별도로 등록해야 합니다, GitHub은 한 앱에 여러 callback URL을 허용하지 않습니다.
대부분 DontCode에 저장된 Client Secret이 잘못되었거나, GitHub에서 시크릿을 재발급한 뒤 DontCode에 다시 붙여넣지 않은 경우입니다. GitHub에서 OAuth 앱을 열어 새 client secret을 발급한 다음 DontCode에 다시 붙여넣고 저장을 클릭하세요. 기존 시크릿은 재발급 시점에 즉시 폐기됩니다.
GitHub이 이메일을 반환하지 않을 때 DontCode가 사용하는 임의 이메일입니다. DontCode가 자동으로 요청하는 user:email scope가 있다면 발생하지 않아야 합니다, 모든 GitHub 사용자는 최소 하나의 인증된 이메일을 가지고 있습니다. 만약 이 메시지를 본다면, 사용자가 동의 도중 이메일 권한을 거절했을 가능성이 큽니다. 사용자에게 다시 시도하고 모든 동의 항목을 승인해 달라고 요청하세요.
처음 로그인할 때와 새 scope가 추가될 때만 발생하는 정상 동작입니다. 동일한 scope에 대해 두 번째 로그인부터는 동의 화면이 표시되지 않습니다. 나중에 scope를 변경하면(예: read:user 추가) 사용자에게 한 번 다시 동의 화면이 표시됩니다.