Microsoft Azure를 OAuth 2.0 인증 공급자로 사용하기

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

Microsoft Azure OAuth 2.0 OmniAuth 공급자를 활성화하고 Microsoft Azure
자격 증명으로 GitLab에 로그인할 수 있습니다.

note
GitLab을 Azure/Entra ID와 처음 통합하는 경우,
Microsoft ID 플랫폼(v2.0) 엔드포인트를 사용하는 OpenID Connect 프로토콜을 구성하세요.

일반 OpenID Connect 구성으로 마이그레이션

GitLab 17.0 이상에서는 azure_oauth2를 사용하는 인스턴스가
일반 OpenID Connect 구성으로 마이그레이션해야 합니다.
자세한 내용은 OpenID Connect 프로토콜로 마이그레이션을 참조하세요.

Azure 애플리케이션 등록

Microsoft Azure OAuth 2.0 OmniAuth 공급자를 활성화하려면
Azure 애플리케이션을 등록하고 클라이언트 ID 및 비밀 키를 가져와야 합니다.

  1. Azure 포털에 로그인합니다.
  2. 여러 Azure Active Directory 테넌트가 있는 경우, 원하는 테넌트로 전환합니다. 테넌트 ID를 기록해 두세요.
  3. 애플리케이션 등록하고 다음 정보를 제공합니다:
    • 리디렉션 URI, 이는 GitLab 설치의 Azure OAuth 콜백 URL을 요구합니다.
      https://gitlab.example.com/users/auth/azure_activedirectory_v2/callback.
    • 애플리케이션 유형, 이는 Web으로 설정해야 합니다.
  4. 클라이언트 ID와 클라이언트 비밀을 저장합니다. 클라이언트 비밀은 한 번만 표시됩니다.

    필요 시, 새 애플리케이션 비밀을 생성할 수 있습니다.

client IDclient secret는 OAuth 2.0과 관련된 용어입니다.
일부 Microsoft 문서에서는 이 용어를 Application IDApplication Secret이라고 명명합니다.

API 권한(스코프) 추가

애플리케이션을 생성한 후, 웹 API를 노출하도록 구성합니다.
다음 Microsoft Graph API에서 위임된 권한을 추가합니다:

  • email
  • openid
  • profile

또는, User.Read.All 애플리케이션 권한을 추가하세요.

GitLab에서 Microsoft OAuth 활성화

note
새 프로젝트의 경우, Microsoft ID 플랫폼(v2.0) 엔드포인트를 사용하는
OpenID Connect 프로토콜을 사용해야 합니다.
  1. GitLab 서버에서 구성 파일을 엽니다.

    • 리눅스 패키지 설치의 경우:

      sudo editor /etc/gitlab/gitlab.rb
      
    • 독립적으로 컴파일한 설치의 경우:

      cd /home/git/gitlab
      
      sudo -u git -H editor config/gitlab.yml
      
  2. 공통 설정을 구성하여
    azure_activedirectory_v2를 단일 로그온 공급자로 추가합니다. 이는
    기존 GitLab 계정이 없는 사용자에 대해 즉시 계정 프로비저닝을 가능하게 합니다.

  3. 공급자 구성을 추가합니다.
    Azure 애플리케이션을 등록할 때 받은 값을 사용하여 <client_id>, <client_secret>, <tenant_id>를 교체합니다.

    • 리눅스 패키지 설치의 경우:

      gitlab_rails['omniauth_providers'] = [
        {
          "name" => "azure_activedirectory_v2",
          "label" => "Provider name", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "Azure AD v2"
          "args" => {
            "client_id" => "<client_id>",
            "client_secret" => "<client_secret>",
            "tenant_id" => "<tenant_id>",
          }
        }
      ]
      
    • 대체 Azure 클라우드의 경우,
      args 섹션에 base_azure_url을 구성합니다. 예를 들어, Azure 정부 커뮤니티 클라우드(GCC)의 경우:

      gitlab_rails['omniauth_providers'] = [
        {
          "name" => "azure_activedirectory_v2",
          "label" => "Provider name", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "Azure AD v2"
          "args" => {
            "client_id" => "<client_id>",
            "client_secret" => "<client_secret>",
            "tenant_id" => "<tenant_id>",
            "base_azure_url" => "https://login.microsoftonline.us"
          }
        }
      ]
      
    • 독립적으로 컴파일한 설치의 경우:

      v2.0 엔드포인트의 경우:

      - { name: 'azure_activedirectory_v2',
          label: 'Provider name', # 로그인 버튼에 대한 선택적 레이블, 기본값은 "Azure AD v2"
          args: { client_id: "<client_id>",
                  client_secret: "<client_secret>",
                  tenant_id: "<tenant_id>" } }
      

      대체 Azure 클라우드의 경우,
      args 섹션에 base_azure_url을 구성합니다. 예를 들어, Azure 정부 커뮤니티 클라우드(GCC)의 경우:

      - { name: 'azure_activedirectory_v2',
          label: 'Provider name', # 로그인 버튼에 대한 선택적 레이블, 기본값은 "Azure AD v2"
          args: { client_id: "<client_id>",
                  client_secret: "<client_secret>",
                  tenant_id: "<tenant_id>",
                  base_azure_url: "https://login.microsoftonline.us" } }
      

    args 섹션에 OAuth 2.0 스코프
    매개변수의 scope를 선택적으로 추가할 수 있습니다. 기본값은 openid profile email입니다.

  4. 구성 파일을 저장합니다.

  5. 리눅스 패키지를 사용하여 설치한 경우 GitLab을 재구성합니다,
    또는 독립적으로 컴파일한 설치의 경우 GitLab을 재시작합니다.

  6. GitLab 로그인 페이지를 새로 고칩니다. Microsoft 아이콘이 로그인 폼 아래에 표시되어야 합니다.

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

기존 GitLab 사용자가 새로운 Azure AD 계정에 연결할 수 있는 방법에 대한 정보는
기존 사용자에 대한 OmniAuth 활성화를 읽어보세요.

문제 해결

사용자 로그인 배너 메시지: Extern UID가 이미 사용 중입니다

로그인할 때 Extern UID가 이미 사용 중입니다라는 오류가 발생할 수 있습니다.

이 문제를 해결하려면 Rails 콘솔을 사용하여 계정에 연결된 기존 사용자가 있는지 확인하세요:

  1. extern_uid를 찾습니다:

    id = Identity.where(extern_uid: '<extern_uid>')
    
  2. 연결된 extern_uid에 해당하는 사용자 이름을 찾기 위해 내용을 출력합니다:

    pp id
    

해당 extern_uid가 계정에 연결되어 있다면, 사용자 이름을 사용하여 로그인할 수 있습니다.

해당 extern_uid가 어떤 사용자 이름에도 연결되어 있지 않다면, 이는 삭제 오류로 인한 유령 레코드일 수 있습니다.

다음 명령을 실행하여 ID를 삭제하여 extern uid를 해제합니다:

 Identity.find('<id>').delete