일반적인 OAuth 2.0 젬을 OAuth 2.0 인증 제공자로 사용하기
omniauth-openid-connect
를 인증 제공자로 사용해야 합니다.omniauth-oauth2-generic
젬을 사용하면 GitLab과 OAuth 2.0 제공자 또는 이 젬과 호환되는 OAuth 2.0 제공자 간에 싱글 사인온(SSO)을 할 수 있습니다.
이 전략은 이 OmniAuth SSO 프로세스를 구성할 수 있습니다:
- 전략은 클라이언트를 구성 가능한 권한 URL로 리디렉션하며 지정된 ID 및 키를 사용합니다.
- OAuth 2.0 제공자는 요청, 사용자 및 (옵션으로) 사용자의 프로필에 대한 인증을 처리합니다.
- OAuth 2.0 제공자는 클라이언트를 GitLab으로 다시 보낸 후, 전략이 액세스 토큰을 검색합니다.
- 전략은 구성 가능한 “사용자 프로필” URL에서 액세스 토큰을 사용하여 사용자 정보를 요청합니다.
- 전략은 응답에서 구성 가능한 형식을 사용하여 사용자 정보를 구문 분석합니다.
- GitLab은 반환된 사용자를 찾거나 생성하고 사용자를 로그인 합니다.
이 전략:
- 싱글 사인온에만 사용할 수 있으며 다른 OAuth 2.0 제공자가 부여하는 다른 접근을 제공하지 않습니다. 예를 들어 프로젝트나 사용자 가져오기.
- GitLab과 같은 클라이언트-서버 애플리케이션에 가장 일반적인 권한 부여 흐름을 지원합니다.
- 하나 이상의 URL에서 사용자 정보를 가져올 수 없습니다.
- JWT 형식의 액세스 토큰에서 사용자 정보를 가져올 수 없습니다.
- JSON을 제외한 사용자 정보 형식으로 테스트되지 않았습니다.
OAuth 2.0 제공자 구성하기
제공자를 구성하려면:
-
OAuth 2.0 제공자에서 애플리케이션을 등록합니다.
애플리케이션을 등록할 때 제공하는 리디렉트 URI는 다음과 같아야 합니다:
http://your-gitlab.host.com/users/auth/oauth2_generic/callback
이제 클라이언트 ID 및 클라이언트 시크릿을 얻을 수 있어야 합니다. 이들이 나타나는 위치는 각 제공자마다 다릅니다. 이것은 또한 애플리케이션 ID 및 애플리케이션 시크릿이라고도 할 수 있습니다.
-
GitLab 서버에서 다음 단계를 완료합니다.
Linux 패키지 (Omnibus)-
공통 설정을 구성하여
oauth2_generic
을 싱글 사인온 제공자로 추가합니다. 이를 사용하면 기존 GitLab 계정이 없는 사용자의 Just-In-Time 계정 프로비저닝이 가능해집니다. -
사용자의 통합을 가능하게 합니다. 예를 들어:
gitlab_rails['omniauth_providers'] = [ { name: "oauth2_generic", label: "Provider name", # 선택 사항. 로그인 버튼을 위한 레이블. 기본값: "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" } } ]
-
파일을 저장하고 GitLab을 재구성합니다:
sudo gitlab-ctl reconfigure
Helm 차트 (Kubernetes)-
공통 설정을 구성하여
oauth2_generic
을 싱글 사인온 제공자로 추가합니다. 이를 사용하면 기존 GitLab 계정이 없는 사용자의 Just-In-Time 계정 프로비저닝이 가능해집니다. -
Helm 값 내보내기:
helm get values gitlab > gitlab_values.yaml
-
Kubernetes Secret로 사용하기 위해
oauth2_generic.yaml
이라는 파일에 다음 내용을 넣습니다:name: "oauth2_generic" label: "Provider name" # 선택 사항. 로그인 버튼에 대한 레이블. 기본값: "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"
-
Kubernetes 시크릿을 생성합니다:
kubectl create secret generic -n <namespace> gitlab-oauth2-generic --from-file=provider=oauth2_generic.yaml
-
gitlab_values.yaml
파일을 편집하고 제공자 구성을 추가합니다:global: appConfig: omniauth: providers: - secret: gitlab-oauth2-generic
-
파일을 저장하고 새 값들을 적용합니다:
helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
자체 컴파일 (소스)-
공통 설정을 구성하여
oauth2_generic
을 싱글 사인온 제공자로 추가합니다. 이를 사용하면 기존 GitLab 계정이 없는 사용자의 Just-In-Time 계정 프로비저닝이 가능해집니다. -
/home/git/gitlab/config/gitlab.yml
파일을 편집합니다:production: &base omniauth: providers: - { name: "oauth2_generic", label: "Provider name", # 선택 사항. 로그인 버튼을 위한 레이블. 기본값: "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" } }
-
파일을 저장하고 GitLab을 다시 시작합니다:
# systemd를 실행 중인 시스템 sudo systemctl restart gitlab.target # SysV init를 실행 중인 시스템 sudo service gitlab restart
-
공통 설정을 구성하여
로그인 페이지에서 일반적인 로그인 양식 아래에 새로운 아이콘이 나타날 것입니다. 그 아이콘을 선택하여 제공자의 인증 프로세스를 시작합니다. 이는 브라우저를 OAuth 2.0 제공자의 인증 페이지로 이동시킵니다. 모든 것이 잘되면, GitLab 인스턴스로 리디렉션되어 로그인됩니다.