Generic OAuth2 gem을 OAuth 2.0 인증 공급자로 사용하기

Tier: Free, Premium, Ultimate Offering: Self-Managed
note
만약 귀하의 공급자가 OpenID 사양을 지원한다면, 인증 공급자로 omniauth-openid-connect을 사용해야 합니다.

omniauth-oauth2-generic gem을 사용하면 GitLab과 OAuth 2.0 공급자, 또는 이 gem과 호환되는 OAuth 2.0 공급자 간의 단일 로그인(SSO)이 가능합니다.

이 전략을 사용하면 다음과 같은 OmniAuth SSO 프로세스를 구성할 수 있습니다:

  1. 전략은 클라이언트를 귀하의 인가 URL로(구성 가능) 지정된 ID와 키와 함께 리디렉션합니다.
  2. OAuth 2.0 공급자는 요청, 사용자 및 (옵션으로) 사용자 프로필에 접근하기 위한 권한 부여를 처리합니다.
  3. OAuth 2.0 공급자는 클라이언트를 GitLab으로 리디렉션하고 전략이 액세스 토큰을 검색합니다.
  4. 전략은 액세스 토큰을 사용하여 “사용자 프로필” 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와 애플리케이션 시크릿이라고도 할 수 있습니다.

  2. GitLab 서버에서 다음 단계를 완료합니다.

    Linux package (Omnibus)
    1. 공통 설정을 구성하여 oauth2_generic을 단일 로그인 공급자로 추가합니다. 기존 GitLab 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
    2. /etc/gitlab/gitlab.rb을 편집하여 공급자의 구성을 추가합니다. 예:

      gitlab_rails['omniauth_providers'] = [
        {
          name: "oauth2_generic",
          label: "공급자 이름", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "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 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
    2. Helm 값을 내보냅니다:

      helm get values gitlab > gitlab_values.yaml
      
    3. 다음 내용을 oauth2_generic.yaml라는 이름의 파일에 넣어 Kubernetes Secret로 사용합니다:

      name: "oauth2_generic"
      label: "공급자 이름" # 로그인 버튼에 대한 선택적 레이블, 기본값은 "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 Secret를 생성합니다:

      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 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
    2. /home/git/gitlab/config/gitlab.yml을 편집합니다:

      production: &base
        omniauth:
          providers:
            - { name: "oauth2_generic",
                label: "공급자 이름", # 로그인 버튼에 대한 선택적 레이블, 기본값은 "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을 다시 시작합니다:

      # systemd를 실행 중인 시스템의 경우
      sudo systemctl restart gitlab.target
            
      # SysV init를 실행 중인 시스템의 경우
      sudo service gitlab restart
      

로그인 페이지에서 기존 로그인 양식 아래에 새로운 아이콘이 표시될 것입니다. 해당 아이콘을 선택하여 공급자의 인증 프로세스를 시작하면 브라우저가 귀하의 OAuth 2.0 공급자의 인증 페이지로 이동합니다. 모든 것이 잘되면 GitLab 인스턴스로 돌아와서 로그인할 수 있습니다.