GitHub을 OAuth 2.0 인증 제공자로 사용하기

Tier: Free, Premium, Ultimate Offering: Self-managed

GitLab 인스턴스를 GitHub.com 및 GitHub Enterprise와 통합할 수 있습니다.
GitHub에서 프로젝트를 가져오거나 GitHub 자격 증명을 사용하여 GitLab에 로그인할 수 있습니다.

GitHub에서 OAuth 앱 만들기

GitHub OmniAuth 제공자를 사용하려면 GitHub에서 OAuth 2.0 클라이언트 ID 및 클라이언트
비밀이 필요합니다:

  1. GitHub에 로그인합니다.
  2. OAuth 앱 만들기
    를 클릭하고 다음 정보를 제공합니다:
    • GitLab 인스턴스의 URL, 예: https://gitlab.example.com.
    • 인증 콜백 URL, 예: https://gitlab.example.com/users/auth.
      GitLab 인스턴스가 비기본 포트를 사용하는 경우 포트 번호를 포함하세요.

보안 취약성 확인

일부 통합의 경우 OAuth 2 covert redirect
취약성으로 인해 GitLab 계정이 타협될 수 있습니다.
이 취약성을 완화하기 위해 인증 콜백 URL에 /users/auth를 추가하세요.

그러나 우리가 아는 한 GitHub은 redirect_uri의 서브 도메인 부분을 검증하지 않습니다.
따라서 서브 도메인 장악, XSS, 또는 웹사이트의 어떤 서브 도메인에서의 열린 리디렉션이
은밀한 리디렉션 공격을 가능하게 할 수 있습니다.

GitLab에서 GitHub OAuth 활성화하기

  1. 공통 설정
    을 구성하여 github를 SSO 제공자로 추가하세요.
    이는 기존 GitLab 계정이 없는 사용자에 대한 즉시 계정 프로비저닝을 활성화합니다.

  2. 다음 정보를 사용하여 GitLab 구성 파일을 편집합니다:

    GitHub 설정 GitLab 구성 파일의 값 설명
    클라이언트 ID YOUR_APP_ID OAuth 2.0 클라이언트 ID
    클라이언트 비밀 YOUR_APP_SECRET OAuth 2.0 클라이언트 비밀
    URL https://github.example.com/ GitHub 배포 URL
    • 리눅스 패키지 설치의 경우:

      1. /etc/gitlab/gitlab.rb 파일을 엽니다.

        GitHub.com의 경우, 다음 섹션을 업데이트합니다:

        gitlab_rails['omniauth_providers'] = [  
          {  
            name: "github",  
            # label: "Provider name", # 로그인 버튼의 선택적 레이블, 기본값은 "GitHub"  
            app_id: "YOUR_APP_ID",  
            app_secret: "YOUR_APP_SECRET",  
            args: { scope: "user:email" }  
          }  
        ]  
        

        GitHub Enterprise의 경우, 다음 섹션을 업데이트하고 https://github.example.com/
        GitHub URL로 교체합니다:

        gitlab_rails['omniauth_providers'] = [  
          {  
            name: "github",  
            # label: "Provider name", # 로그인 버튼의 선택적 레이블, 기본값은 "GitHub"  
            app_id: "YOUR_APP_ID",  
            app_secret: "YOUR_APP_SECRET",  
            url: "https://github.example.com/",  
            args: { scope: "user:email" }  
          }  
        ]  
        
      2. 파일을 저장하고 재구성
        GitLab을 재구성합니다.

    • 사용자 컴파일 설치의 경우:

      1. config/gitlab.yml 파일을 엽니다.

        GitHub.com의 경우, 다음 섹션을 업데이트합니다:

        - { name: 'github',  
            # label: 'Provider name', # 로그인 버튼의 선택적 레이블, 기본값은 "GitHub"  
            app_id: 'YOUR_APP_ID',  
            app_secret: 'YOUR_APP_SECRET',  
            args: { scope: 'user:email' } }  
        

        GitHub Enterprise의 경우, 다음 섹션을 업데이트하고 https://github.example.com/
        GitHub URL로 교체합니다:

        - { name: 'github',  
            # label: 'Provider name', # 로그인 버튼의 선택적 레이블, 기본값은 "GitHub"  
            app_id: 'YOUR_APP_ID',  
            app_secret: 'YOUR_APP_SECRET',  
            url: "https://github.example.com/",  
            args: { scope: 'user:email' } }  
        
      2. 파일을 저장하고 재시작
        GitLab을 재시작합니다.

  3. GitLab 로그인 페이지를 새로 고칩니다.
    로그인 양식 아래에 GitHub 아이콘이 표시되어야 합니다.

  4. 아이콘을 선택합니다. GitHub에 로그인하고 GitLab 애플리케이션을 승인합니다.

문제 해결

자가 서명 인증서를 사용한 GitHub Enterprise에서의 가져오기 실패

자가 서명 인증서를 사용하여 GitHub Enterprise에서 프로젝트를 가져오면 가져오기가 실패합니다.

이 문제를 해결하려면 SSL 검증을 비활성화해야 합니다:

  1. 구성 파일에서 verify_sslfalse로 설정합니다.

    • Linux 패키지 설치의 경우:

      gitlab_rails['omniauth_providers'] = [
        {
          name: "github",
          # label: "Provider name", # 로그인 버튼의 선택적 레이블, 기본값은 "GitHub"
          app_id: "YOUR_APP_ID",
          app_secret: "YOUR_APP_SECRET",
          url: "https://github.example.com/",
          verify_ssl: false,
          args: { scope: "user:email" }
        }
      ]
      
    • 자가 컴파일 설치의 경우:

      - { name: 'github',
          # label: 'Provider name', # 로그인 버튼의 선택적 레이블, 기본값은 "GitHub"
          app_id: 'YOUR_APP_ID',
          app_secret: 'YOUR_APP_SECRET',
          url: "https://github.example.com/",
          verify_ssl: false,
          args: { scope: 'user:email' } }
      
  2. GitLab 서버에서 전역 Git sslVerify 옵션을 false로 변경합니다.

    • GitLab 15.3 및 이후 버전을 실행하는 Linux 패키지 설치의 경우:

      gitaly['gitconfig'] = [
         {key: "http.sslVerify", value: "false"},
      ]
      
    • GitLab 15.2 및 이전 버전(레거시 방법)을 실행하는 Linux 패키지 설치의 경우:

      omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] }
      
    • GitLab 15.3 및 이후 버전을 실행하는 자가 컴파일 설치의 경우, Gitaly 구성(gitaly.toml)을 편집합니다:

      [[git.config]]
      key = "http.sslVerify"
      value = "false"
      
    • GitLab 15.2 및 이전 버전(레거시 방법)을 실행하는 자가 컴파일 설치의 경우:

      git config --global http.sslVerify false
      
  3. GitLab 재구성 Linux 패키지를 사용하여 설치한 경우, 또는 GitLab 재시작 자가 컴파일 설치한 경우.

GitHub Enterprise에 로그인할 때 500 오류 발생

이 오류는 GitLab 인스턴스와 GitHub Enterprise 간의 네트워크 연결 문제로 인해 발생할 수 있습니다.

연결 문제를 확인하려면:

  1. GitLab 서버의 production.log로 이동하여 다음 오류를 찾습니다:

    Faraday::ConnectionFailed (execution expired)
    
  2. Rails 콘솔 시작 하고 다음 명령을 실행합니다. <github_url>을 GitHub Enterprise 인스턴스의 URL로 바꿉니다:

    uri = URI.parse("https://<github_url>") # 여기서 `GitHub-URL`을 실제로 바꿉니다
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = 1
    response = http.request(Net::HTTP::Get.new(uri.request_uri))
    
  3. 유사한 execution expired 오류가 반환되면 이 오류는 연결 문제로 인해 발생했음을 확인합니다. GitLab 서버가 GitHub Enterprise 인스턴스에 도달할 수 있는지 확인하세요.

GitLab 계정이 없는 상태에서 GitHub 계정을 사용하여 로그인하는 것은 허용되지 않습니다

GitLab에 로그인할 때 다음과 같은 오류가 발생합니다:

GitLab 계정이 없는 상태에서 GitHub 계정을 사용하여 로그인하는 것은 허용되지 않습니다. 먼저 GitLab 계정을 생성한 후, 
GitHub 계정에 연결하세요.

이 문제를 해결하려면 GitLab에서 GitHub 로그인 기능을 활성화해야 합니다:

  1. 왼쪽 사이드바에서 아바타를 선택합니다.
  2. 프로필 편집을 선택합니다.
  3. 왼쪽 사이드바에서 계정을 선택합니다.
  4. 서비스 로그인 섹션에서 GitHub에 연결을 선택합니다.