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

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

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

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.
    • 웹으로 설정해야 하는 응용 프로그램 유형입니다.
  4. 클라이언트 ID와 클라이언트 시크릿을 저장합니다. 클라이언트 시크릿은 한 번만 표시됩니다.

    필요한 경우 새 응용 프로그램 비밀을 생성할 수 있습니다.

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

API 권한(범위) 추가

응용 프로그램을 만든 후 웹 API를 노출하도록 구성하고 Microsoft 그래프 API에 다음 위임된 권한(Delegated Permissions)을 추가합니다:

  • email
  • openid
  • profile

또는 User.Read.All 응용 프로그램 권한을 추가합니다.

GitLab에서 Microsoft OAuth 활성화

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

    • Linux 패키지 설치의 경우:

      sudo editor /etc/gitlab/gitlab.rb
      
    • 자체 컴파일된 설치의 경우:

      cd /home/git/gitlab
           
      sudo -u git -H editor config/gitlab.yml
      
  2. 공통 설정을 구성하여 azure_activedirectory_v2를 단일 사인온(Single Sign-On) 공급자로 추가합니다. 기존의 GitLab 계정이 없는 사용자를 위해 즉시 계정 프로비저닝을 가능하도록 합니다.

  3. 제공자 구성을 추가합니다. Azure 애플리케이션을 등록할 때 얻은 값으로 <client_id>, <client_secret>, 및 <tenant_id>를 대체합니다.

    • Linux 패키지 설치의 경우:

      gitlab_rails['omniauth_providers'] = [
        {
          "name" => "azure_activedirectory_v2",
          "label" => "공급자 이름", # 로그인 버튼의 선택 사항 레이블, 기본값은 "Azure AD v2"
          "args" => {
            "client_id" => "<client_id>",
            "client_secret" => "<client_secret>",
            "tenant_id" => "<tenant_id>",
          }
        }
      ]
           
      
    • 대체 Azure 클라우드에 대한 경우, args 섹션 아래에 base_azure_url을 구성합니다. 예를 들어, Azure Government Community Cloud (GCC)의 경우:

      gitlab_rails['omniauth_providers'] = [
        {
          "name" => "azure_activedirectory_v2",
          "label" => "공급자 이름", # 로그인 버튼의 선택 사항 레이블, 기본값은 "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: '공급자 이름', # 로그인 버튼의 선택 사항 레이블, 기본값은 "Azure AD v2"
          args: { client_id: "<client_id>",
                  client_secret: "<client_secret>",
                  tenant_id: "<tenant_id>" } }
      

      대체 Azure 클라우드에 대한 경우, args 섹션 아래에 base_azure_url을 구성합니다. 예를 들어, Azure Government Community Cloud (GCC)의 경우:

      - { name: 'azure_activedirectory_v2',
          label: '공급자 이름', # 로그인 버튼의 선택 사항 레이블, 기본값은 "Azure AD v2"
          args: { client_id: "<client_id>",
                  client_secret: "<client_secret>",
                  tenant_id: "<tenant_id>",
                  base_azure_url: "https://login.microsoftonline.us" } }
      

    또는 선택적으로 scopeOAuth 2.0 범위 매개변수로 args 섹션에 추가할 수 있습니다. 기본값은 openid profile email입니다.

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

  5. Linux 패키지를 사용하여 설치한 경우 GitLab을 재구성하거나, 자체 컴파일하여 설치한 경우 GitLab을 다시 시작합니다.

  6. GitLab 로그인 페이지를 새로 고칩니다. Microsoft 아이콘이 로그인 양식 아래에 표시됩니다.

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

기존의 GitLab 사용자가 새로운 Azure AD 계정에 연결하는 방법에 대한 정보는 기존 사용자용으로 OmniAuth 활성화를 참조하세요.

문제 해결

사용자 로그인 배너 메시지: Extern UID has already been taken

로그인하면 Extern UID has already been taken 오류가 발생할 수 있습니다.

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

  1. extern_uid를 찾습니다:

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

    pp id
    

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

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

extern uid를 해제하기 위해 다음 명령을 실행합니다:

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