OAuth 2.0認証プロバイダとしてMicrosoft Azureを使用します。

Microsoft Azure OAuth 2.0 OmniAuthプロバイダを有効にして、Microsoft Azureの認証情報でGitLabにサインインすることができます。以前のAzure Active Directory v1.0エンドポイントを使用するプロバイダ、またはv2.0エンドポイントを使用するプロバイダを設定できます。

note
新しいプロジェクトでは、Microsoft Identity Platform (v2.0) エンドポイントを使用するOpenID Connect プロトコルを使用することをお勧めします。

OpenID Connectプロトコルへのマイグレーション

OpenID Connectプロトコルにマイグレーションするには、複数のOpenID Connectプロバイダーの設定を参照してください。

プロバイダによって異なるuid_field を設定する必要があります:

プロバイダーuid備考
omniauth-azure-oauth2sub追加属性oid,tid は情報オブジェクト内部で提供されます。
omniauth-azure-activedirectory-v2oidマイグレーション時には、oiduid_field として設定する必要があります。
omniauth_openid_connectsub別のフィールドを使用する場合はuid_field を指定してください。

omniauth-azure-oauth2 からomniauth_openid_connect にマイグレーションするには、設定を変更する必要があります。

Linux package (Omnibus)

既存の設定の一部を削除し、図のように新しい設定を追加します。

gitlab_rails['omniauth_providers'] = [
  {
    name: "azure_oauth2",
    # label: "Provider name", # optional label for login button, defaults to "Azure AD"
    args: {
+      name: "azure_oauth2",
+      strategy_class: "OmniAuth::Strategies::OpenIDConnect",
+      scope: ["openid", "profile", "email"],
+      response_type: "code",
+      issuer:  "https://login.microsoftonline.com/<tenant_id>/v2.0",
+      client_auth_method: "query",
+      discovery: true,
+      uid_field: "sub",
+      client_options: {
+        identifier: "<client_id>",
+        secret: "<client_secret>",
+        redirect_uri: "https://gitlab.example.com/users/auth/azure_oauth2/callback"
+      }
-      client_id: "<client_id>",
-      client_secret: "<client_secret>",
-      tenant_id: "<tenant_id>",
    }
  }
]
Self-compiled (source)

既存の設定の一部を削除し、図のように新しい設定を追加します。

  - { name: 'azure_oauth2',
      # label: 'Provider name', # optional label for login button, defaults to "Azure AD"
-      args: { client_id: '<client_id>',
-              client_secret: '<client_secret>',
-              tenant_id: '<tenant_id>' } }
+      icon: "<custom_provider_icon>",
+      args: {
+        name: "azure_oauth2",
+        strategy_class: "OmniAuth::Strategies::OpenIDConnect",
+        scope: ["openid","profile","email"],
+        response_type: "code",
+        issuer: 'https://login.microsoftonline.com/<tenant_id>/v2.0',
+        discovery: true,
+        client_auth_method: 'query',
+        uid_field: 'sub',
+        send_scope_to_token_endpoint: "false",
+        client_options: {
+          identifier: "<client_id>",
+          secret: "<client_secret>",
+          redirect_uri: "<your_gitlab_url>/users/auth/azure_oauth2/callback"
+        }
+      }
    }

例えば、omniauth-azure-activedirectory-v2 からomniauth_openid_connect にマイグレーションするには、設定を変更する必要があります。

Linux package (Omnibus)

既存の設定の一部を削除し、図のように新しい設定を追加します。

gitlab_rails['omniauth_providers'] = [
  {
 -    name: "azure_activedirectory_v2",
    # label: "Provider name", # optional label for login button, defaults to "Azure AD v2"
    args: {
+      name: "azure_activedirectory_v2",
+      strategy_class: "OmniAuth::Strategies::OpenIDConnect",
+      scope: ["openid", "profile", "email"],
+      response_type: "code",
+      issuer:  "https://login.microsoftonline.com/<tenant_id>/v2.0",
+      client_auth_method: "query",
+      discovery: true,
+      uid_field: "oid",
+      client_options: {
+        identifier: "<client_id>",
+        secret: "<client_secret>",
+        redirect_uri: "https://gitlab.example.com/users/auth/azure_activedirectory_v2/callback"
+      }
-      client_id: "<client_id>",
-      client_secret: "<client_secret>",
-      tenant_id: "<tenant_id>",
    }
  }
]
Self-compiled (source)

既存の設定の一部を削除し、図のように新しい設定を追加します。

  - { name: 'azure_activedirectory_v2',
      # label: 'Provider name', # optional label for login button, defaults to "Azure AD v2"
-      args: { client_id: '<client_id>',
-              client_secret: '<client_secret>',
-              tenant_id: '<tenant_id>' } }
+      icon: "<custom_provider_icon>",
+      args: {
+        name: "azure_activedirectory_v2",
+        strategy_class: "OmniAuth::Strategies::OpenIDConnect",
+        scope: ["openid","profile","email"],
+        response_type: "code",
+        issuer: 'https://login.microsoftonline.com/<tenant_id>/v2.0',
+        discovery: true,
+        client_auth_method: 'query',
+        uid_field: 'oid',
+        send_scope_to_token_endpoint: "false",
+        client_options: {
+          identifier: "<client_id>",
+          secret: "<client_secret>",
+          redirect_uri: "<your_gitlab_url>/users/auth/azure_activedirectory_v2/callback"
+        }
+      }
    }

その他のカスタマイズの詳細については、gitlab_username_claimを参照してください。

Azure アプリケーションの登録

Microsoft Azure OAuth 2.0 OmniAuth プロバイダを有効にするには、Azure アプリケーションを登録し、クライアント ID とシークレットキーを取得する必要があります。

  1. Azure ポータルにサインインします。
  2. Azure Active Directory のテナントが複数ある場合は、目的のテナントに切り替えます。テナント ID をメモします。
  3. アプリケーションを登録し、以下の情報を入力します:
    • GitLab インストールの Azure OAuth コールバックの URL が必要です。例えば
      • v1.0 エンドポイントの場合:https://gitlab.example.com/users/auth/azure_oauth2/callback.
      • v2.0エンドポイントについては、https://gitlab.example.com/users/auth/azure_activedirectory_v2/callback
    • アプリケーション・タイプは、Web に設定する必要があります。
  4. クライアントIDとクライアントシークレットを保存します。クライアントシークレットは一度しか表示されません。

    必要に応じて、新しいアプリケーションシークレットを作成できます。

client IDclient secret は OAuth 2.0 に関連する用語です。マイクロソフトのドキュメントでは、この用語はApplication IDApplication Secretという名前になっているものもあります。

API権限(スコープ)の追加

v2.0 エンドポイントを使用している場合は、アプリケーションを作成した後、Web API を公開するように設定します。Microsoft Graph APIの下に以下の権限を追加します:

  • email
  • openid
  • profile

または、User.Read.All アプリケーション権限を追加します。

GitLab で Microsoft OAuth を有効にします。

  1. GitLab サーバーで設定ファイルを開きます。

    • Linuxパッケージ・インストールの場合:

       sudo editor /etc/gitlab/gitlab.rb
      
    • セルフコンパイルによるインストールの場合:

       cd /home/git/gitlab
            
       sudo -u git -H editor config/gitlab.yml
      
  2. 共通設定を構成して、シングルサインオンプロバイダとしてazure_oauth2 。これにより、既存のGitLabアカウントを持っていないユーザーのためのJust-In-Timeアカウントプロビジョニングが可能になります。

  3. プロバイダー設定を追加します。<client_id><client_secret><tenant_id> を Azure アプリケーションを登録したときに取得した値に置き換えます。

    • Linuxパッケージ・インストールの場合:

      v1.0エンドポイントの場合:

       gitlab_rails['omniauth_providers'] = [
         {
           name: "azure_oauth2",
           # label: "Provider name", # optional label for login button, defaults to "Azure AD"
           args: {
             client_id: "<client_id>",
             client_secret: "<client_secret>",
             tenant_id: "<tenant_id>",
           }
         }
       ]
      

      v2.0エンドポイントの場合:

       gitlab_rails['omniauth_providers'] = [
         {
           "name" => "azure_activedirectory_v2",
           "label" => "Provider name", # optional label for login button, defaults to "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" => "Provider name", # optional label for login button, defaults to "Azure AD v2"
           "args" => {
             "client_id" => "<client_id>",
             "client_secret" => "<client_secret>",
             "tenant_id" => "<tenant_id>",
             "base_azure_url" => "https://login.microsoftonline.us"
           }
         }
       ]
      
    • セルフコンパイルによるインストールの場合:

      v1.0エンドポイントの場合:

       - { name: 'azure_oauth2',
           # label: 'Provider name', # optional label for login button, defaults to "Azure AD"
           args: { client_id: '<client_id>',
                   client_secret: '<client_secret>',
                   tenant_id: '<tenant_id>' } }
      

      v2.0エンドポイントの場合:

       - { name: 'azure_activedirectory_v2',
           label: 'Provider name', # optional label for login button, defaults to "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: 'Provider name', # optional label for login button, defaults to "Azure AD v2"
           args: { client_id: "<client_id>",
                   client_secret: "<client_secret>",
                   tenant_id: "<tenant_id>",
                   base_azure_url: "https://login.microsoftonline.us" } }
      

    また、オプションでargs セクションにscope forOAuth 2.0 scopesパラメータを追加できます。デフォルトはopenid profile emailです。

  4. 設定ファイルを保存します。

  5. Linuxパッケージを使ってインストールした場合はGitLabを再設定し、セルフコンパイルでインストールした場合はGitLabを再起動します。

  6. GitLab サインインページを更新してください。サインインフォームの下にMicrosoftのアイコンが表示されるはずです。

  7. アイコンを選択します。Microsoftにサインインし、GitLabアプリケーションを承認します。

既存のGitLabユーザーが新しいAzure ADアカウントに接続する方法については、Enable OmniAuth for an existing userをお読みください。

トラブルシューティング

ユーザーサインインのバナーメッセージ:外部UIDは既に取得されています

サインイン時に、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 、どのユーザー名にも添付されていない場合は、削除エラーによりゴーストレコードになっている可能性があります。

次のコマンドを実行して ID を削除し、extern uid をリリースしてください:

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