OAuth2.0認証プロバイダとしてGeneric OAuth2 gemを使用します。

omniauth-oauth2-generic gemは、GitLabとあなたのOAuth 2.0プロバイダ、またはこのgemと互換性のあるOAuth 2.0プロバイダとの間のシングルサインオン(SSO) を可能にします。

この戦略では、この OmniAuth SSO プロセスの設定を行います:

  1. ストラテジーは指定された ID とキーでクライアントを作成者の認証 URL(設定可能) に誘導します。
  2. OAuth 2.0 プロバイダは、リクエスト、ユーザー、そして (オプションで) ユーザーのプロファイルにアクセスするための認証の作成者を処理します。
  3. OAuth 2.0 プロバイダはクライアントを GitLab に戻し、Strategy がアクセストークンを取得します。
  4. Strategy はアクセストークンを使って設定可能な“user profile” URL からユーザー情報を要求します。
  5. ストラテジーは設定可能なフォーマットを使ってレスポンスからユーザー情報を解析します。
  6. GitLabは返されたユーザーを見つけるか作成し、サインインします。

この戦略は

  • シングルサインオンのためにのみ使用でき、OAuth 2.0 プロバイダによって許可された他のアクセスは提供しません。例えば、プロジェクトやユーザーのインポートなどです。
  • GitLabのようなクライアントサーバーアプリケーションで最も一般的な、作成者許可フローのみをサポートします。
  • 複数の URL からユーザー情報を取得することはできません。
  • JSON以外のユーザー情報フォーマットではテストされていません。

OAuth 2.0 プロバイダの設定

プロバイダを設定します:

  1. 認証したい OAuth 2.0 プロバイダにアプリケーションを登録します。

    アプリケーションの登録時に指定するリダイレクトURIは、以下のようにします:

    http://your-gitlab.host.com/users/auth/oauth2_generic/callback
    

    これで、クライアントIDとクライアントシークレットを取得できるはずです。クライアント ID とクライアント・シークレットを取得できるはずです。これはアプリケーションIDとアプリケーションシークレットとも呼ばれます。

  2. GitLab サーバー上で、以下の手順を実行します。

    Linux package (Omnibus)
    1. 共通設定を構成して、シングルサインオンプロバイダとしてoauth2_generic 。これにより、既存のGitLabアカウントを持っていないユーザーのためのJust-In-Timeアカウントプロビジョニングが可能になります。
    2. /etc/gitlab/gitlab.rb を編集して、プロバイダの設定を追加します。例えば

      gitlab_rails['omniauth_providers'] = [
        {
          name: "oauth2_generic",
          label: "Provider name", # optional label for login button, defaults to "Oauth2 Generic"
          app_id: "<your_app_client_id>",
          app_secret: "<your_app_client_secret>",
          args: {
            client_options: {
              site: "<your_auth_server_url>",
              user_info_url: "/oauth2/v1/userinfo",
              authorize_url: "/oauth2/v1/authorize",
              token_url: "/oauth2/v1/token"
            },
            user_response_structure: {
              root_path: [],
              id_path: ["sub"],
              attributes: {
                email: "email",
                name: "name"
              }
            },
            authorize_params: {
              scope: "openid profile email"
            },
            strategy_class: "OmniAuth::Strategies::OAuth2Generic"
          }
        }
      ]
      
    3. ファイルを保存して GitLab を再設定してください:

      sudo gitlab-ctl reconfigure
      
    Helm chart (Kubernetes)
    1. 共通設定を構成して、シングルサインオンプロバイダとしてoauth2_generic 。これにより、既存のGitLabアカウントを持っていないユーザーのためのJust-In-Timeアカウントプロビジョニングが可能になります。
    2. Helm の値をエクスポートします:

      helm get values gitlab > gitlab_values.yaml
      
    3. Kubernetesシークレットとして使用するために、以下の内容をoauth2_generic.yaml という名前のファイルに入れます:

      name: "oauth2_generic"
      label: "Provider name" # optional label for login button defaults to "Oauth2 Generic"
      app_id: "<your_app_client_id>"
      app_secret: "<your_app_client_secret>"
      args:
        client_options:
          site: "<your_auth_server_url>"
          user_info_url: "/oauth2/v1/userinfo"
          authorize_url: "/oauth2/v1/authorize"
          token_url: "/oauth2/v1/token"
        user_response_structure:
          root_path: []
          id_path: ["sub"]
          attributes:
            email: "email"
            name: "name"
        authorize_params:
          scope: "openid profile email"
        strategy_class: "OmniAuth::Strategies::OAuth2Generic"
      
    4. Kubernetesシークレットを作成します:

      kubectl create secret generic -n <namespace> gitlab-oauth2-generic --from-file=provider=oauth2_generic.yaml
      
    5. gitlab_values.yaml を編集し、プロバイダ設定を追加します:

      global:
        appConfig:
          omniauth:
            providers:
              - secret: gitlab-oauth2-generic
      
    6. ファイルを保存して、新しい値を適用します:

      helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
      
    Self-compiled (source)
    1. 共通設定を構成して、シングルサインオンプロバイダとしてoauth2_generic 。これにより、既存のGitLabアカウントを持っていないユーザーのためのJust-In-Timeアカウントプロビジョニングが可能になります。
    2. /home/git/gitlab/config/gitlab.yml を編集します:

      production: &base
        omniauth:
          providers:
            - { name: "oauth2_generic",
                label: "Provider name", # optional label for login button, defaults to "Oauth2 Generic"
                app_id: "<your_app_client_id>",
                app_secret: "<your_app_client_secret>",
                args: {
                  client_options: {
                    site: "<your_auth_server_url>",
                    user_info_url: "/oauth2/v1/userinfo",
                    authorize_url: "/oauth2/v1/authorize",
                    token_url: "/oauth2/v1/token"
                  },
                  user_response_structure: {
                    root_path: [],
                    id_path: ["sub"],
                    attributes: {
                      email: "email",
                      name: "name"
                    }
                  },
                  authorize_params: {
                    scope: "openid profile email"
                  },
                  strategy_class: "OmniAuth::Strategies::OAuth2Generic"
                }
              }
      
    3. ファイルを保存して GitLab を再起動します:

      # For systems running systemd
      sudo systemctl restart gitlab.target
            
      # For systems running SysV init
      sudo service gitlab restart
      

サインインページでは、通常のサインインフォームの下に新しいアイコンが表示されているはずです。そのアイコンを選択すると、プロバイダの認証プロセスが始まります。これでブラウザが OAuth 2.0 プロバイダの認証ページに移動します。すべてがうまくいけば、GitLab インスタンスに戻り、サインインします。