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

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

GitHub.com 및 GitHub Enterprise와 GitLab 인스턴스를 통합할 수 있습니다. 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 숨겨진 리디렉션 취약점이 GitLab 계정을 compromise할 수 있습니다. 이 취약점을 완화하려면 인가 콜백 URL에 /users/auth를 추가하십시오.

그러나 우리의 지식으로는 GitHub은 redirect_uri의 서브도메인 부분을 유효성 검사하지 않습니다. 따라서 웹사이트의 어떤 서브도메인에서라도 서브도메인 탈취, XSS 또는 열린 리디렉트가 숨겨진 리디렉트 공격을 가능하게 할 수 있습니다.

GitLab에서 GitHub OAuth 활성화하기

  1. 공통 설정을 구성하여 github를 단일 로그인 공급자로 추가합니다. 이렇게 하면 기존 GitLab 계정이 없는 사용자들을 위해 Just-In-Time 계정 프로비저닝이 가능해집니다.

  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
    • Linux 패키지 설치의 경우:

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

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

        gitlab_rails['omniauth_providers'] = [
          {
            name: "github",
            # label: "Provider name", # optional label for login button, defaults to "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", # optional label for login button, defaults to "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', # optional label for login button, defaults to "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', # optional label for login button, defaults to "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",
          app_id: "YOUR_APP_ID",
          app_secret: "YOUR_APP_SECRET",
          url: "https://github.example.com/",
          verify_ssl: false,
          args: { scope: "user:email" }
        }
      ]
      
    • 직접 컴파일한 설치의 경우:

      - { 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로 변경합니다.

    • Linux 패키지 설치의 경우 GitLab 15.3 이상:

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

      omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] }
      
    • 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>")
    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에 연결을 선택합니다.