Generic OAuth 인증 구성
Generic OAuth 인증 구성 (Configure Generic OAuth authentication)
Grafana에는 사용자 신원을 검증하는 많은 인증 방법이 있어요. 특정 OAuth2 제공자용 통합(Entra ID, GitHub, GitLab, Google, Grafana.com, Keycloak, Okta)이 내장되어 있지만, 그 외의 제공자를 쓴다면 Generic OAuth 인증을 사용할 수 있어요. 이 문서는 Generic OAuth를 UI, Terraform, 구성 파일로 설정하는 방법과 역할·조직·팀 매핑, 그리고 여러 OAuth2 제공자별 예시를 다룹니다.
본문
인증 구성은 어떤 사용자가 Grafana에 접근할 수 있고 어떤 방법으로 로그인할 수 있는지를 결정해요. 또한 인증 제공자 통합이 반환한 정보에 따라 Grafana가 사용자의 역할과 팀 멤버십을 자동으로 업데이트하도록 구성할 수 있어요.
인증 방법 선택 시 현재의 아이덴티티·접근 관리 시스템과 요구하는 인증·인가 기능을 고려해야 해요. 전체 인증 옵션 목록은 Configure authentication 문서를 참고하세요. OAuth2 제공자가 목록에 없다면 Generic OAuth 인증을 사용해요.
시작하기 전에 (Before you begin)
- OAuth2 제공자로 OAuth2 애플리케이션을 만드는 방법을 알아야 해요. 제공자 문서를 참고하세요.
- IdP가
sub클레임 같은 OpenID UserInfo 호환 정보를 반환해야 해요. - 리프레시 토큰을 사용한다면 제공자로 설정하는 방법을 알아야 해요.
- 사용자가 Entra ID에서 다른 인증 제공자(예: Grafana.com)와 같은 이메일 주소를 쓴다면, 사용자가 올바르게 매칭되도록 추가 구성이 필요해요.
Grafana UI로 Generic OAuth 클라이언트 구성
Grafana Admin은 Grafana 내부의 Generic OAuth UI를 사용해 클라이언트를 구성할 수 있어요. Administration > Authentication > Generic OAuth 페이지로 이동해 폼을 채워요. 구성 파일에 현재 구성이 있으면 폼이 해당 값으로 미리 채워지고, 없으면 기본값이 들어 있어요. 폼을 채운 뒤 Save를 클릭해 저장해요. 저장이 성공하면 Grafana가 새 구성을 적용해요. 변경 사항을 기본값으로 재설정하려면 Reset을 클릭해요.
참고: Grafana를 고가용성 모드로 실행하면 구성 변경이 모든 인스턴스에 즉시 적용되지 않을 수 있어요. 몇 분 기다려야 할 수도 있어요.
Terraform 제공자로 Generic OAuth 클라이언트 구성
resource "grafana_sso_settings" "generic_sso_settings" {
provider_name = "generic_oauth"
oauth2_settings {
name = "Auth0"
auth_url = "https://<domain>/authorize"
token_url = "https://<domain>/oauth/token"
api_url = "https://<domain>/userinfo"
client_id = "<client-id>"
client_secret = "<client-secret>"
allow_sign_up = true
auto_login = false
scopes = "openid profile email offline_access"
use_pkce = true
use_refresh_token = true
}
}
grafana_sso_settings 리소스의 완전한 참조는 Terraform Registry를 참고하세요.
Grafana 구성 파일로 Generic OAuth 클라이언트 구성
OAuth2 제공자를 Generic OAuth 인증으로 Grafana와 통합하려면:
- 선택한 OAuth2 제공자에 OAuth2 애플리케이션을 만들어요.
- OAuth2 앱의 콜백 URL을
http://<grafana-domain>/login/generic_oauth로 설정해요. 콜백 URL은 브라우저로 Grafana에 접근하는 데 사용하는 완전한 HTTP 주소에/login/generic_oauth경로를 붙인 것이어야 해요. 프록시 뒤에서 서빙한다면 구성 파일[server]섹션의root_url옵션 설정이 필요할 수 있어요. - 구성 파일의
[auth.generic_oauth]섹션에서 다음 필드를 업데이트해요.
| 필드 | 설명 |
|---|---|
client_id, client_secret |
OAuth2 앱의 client ID와 client secret과 일치해야 함. |
auth_url |
OAuth2 제공자의 인증 엔드포인트. |
api_url |
OAuth2 제공자의 사용자 정보 엔드포인트. 이 엔드포인트가 반환하는 정보는 OpenID UserInfo와 호환되어야 함. |
enabled |
Generic OAuth 인증을 활성화. true로 설정. |
- 다른 Generic OAuth 구성 옵션을 검토하고 필요에 따라 완성해요.
- (선택) 리프레시 토큰 구성:
a. 구성 파일
[auth.generic_oauth]섹션의scopes필드를 제공자의 리프레시 토큰 스코프로 확장. b. 구성 파일[auth.generic_oauth]섹션에서use_refresh_token을true로 설정. c. 필요하면 제공자에서 리프레시 토큰 활성화. - 역할 매핑을 구성해요.
- (선택) 팀 동기화를 구성해요.
- Grafana를 재시작해요.
이제 로그인 페이지에 Generic OAuth 로그인 버튼이 나타나고 OAuth2 제공자로 로그인·가입할 수 있어요.
로그인 구성 (Configure login)
Grafana는 OAuth2 ID 토큰, UserInfo 엔드포인트에서 검색한 사용자 정보, 또는 OAuth2 액세스 토큰에서 사용자의 로그인을 해석할 수 있어요. 나열된 순서대로 살펴보다 로그인을 찾아요. 로그인을 찾지 못하면 사용자의 로그인은 이메일 주소로 설정돼요.
중요: Generic OAuth 가입·로그인에는 이메일이 필수예요. 다른 클레임(예:
sub)에서login을 매핑해도 Grafana는 여전히 이메일이 있어야 해요. 제공자가 email 클레임을 반환하는지 확인하거나email_attribute_path를 구성해 해석되게 하세요.openid profile email사용).
사용자 로그인을 제공자가 어떻게 반환하는지에 따라 구성할 것:
| 로그인 소스 | 필요 구성 |
|---|---|
OAuth2 ID 토큰의 login 또는 username 필드 |
N/A |
| OAuth2 ID 토큰의 다른 필드 | login_attribute_path 구성 옵션 설정 |
UserInfo 엔드포인트 사용자 정보의 login 또는 username 필드 |
N/A |
| UserInfo 엔드포인트 사용자 정보의 다른 필드 | login_attribute_path 구성 옵션 설정 |
OAuth2 액세스 토큰의 login 또는 username 필드 |
N/A |
| OAuth2 액세스 토큰의 다른 필드 | login_attribute_path 구성 옵션 설정 |
로그인에 sub 클레임 사용:
대부분의 OAuth2 제공자는 sub 클레임에 안정적인 주제 식별자를 노출해요. login_attribute_path를 sub로 설정해 Grafana 로그인을 채울 수 있어요. 이메일이 여전히 필요하므로 Grafana가 사용자 이메일을 해석할 수 있게 하세요(email 스코프 포함 또는 email_attribute_path로 커스텀 필드 매핑).
예시 구성:
[auth.generic_oauth]
enabled = true
scopes = openid profile email
login_attribute_path = sub
# If your provider does not return `email` at the top level, map it explicitly
# email_attribute_path = user.email
표시 이름 구성 (Configure display name)
Grafana는 OAuth2 ID 토큰, UserInfo 엔드포인트, 또는 액세스 토큰에서 표시 이름을 해석할 수 있어요. 표시 이름을 찾지 못하면 로그인이 대신 표시돼요.
| 표시 이름 소스 | 필요 구성 |
|---|---|
ID 토큰의 name 또는 display_name 필드 |
N/A |
| ID 토큰의 다른 필드 | name_attribute_path 설정 |
UserInfo의 name 또는 display_name 필드 |
N/A |
| UserInfo의 다른 필드 | name_attribute_path 설정 |
액세스 토큰의 name 또는 display_name 필드 |
N/A |
| 액세스 토큰의 다른 필드 | name_attribute_path 설정 |
이메일 주소 구성 (Configure email address)
Grafana는 ID 토큰, UserInfo 엔드포인트, 액세스 토큰, 또는 OAuth2 /emails 엔드포인트에서 이메일 주소를 해석할 수 있어요. 이메일을 찾지 못하면 사용자의 이메일은 빈 문자열로 설정돼요.
| 이메일 소스 | 필요 구성 |
|---|---|
ID 토큰의 email 필드 |
N/A |
ID 토큰의 attributes 맵 |
email_attribute_name 설정. 기본은 email:primary 키에서 검색. |
ID 토큰의 upn 필드 |
N/A |
UserInfo의 email 필드 |
N/A |
| UserInfo의 다른 필드 | email_attribute_path 설정 |
액세스 토큰의 email 필드 |
N/A |
액세스 토큰의 attributes 맵 |
email_attribute_name 설정. 기본은 email:primary. |
액세스 토큰의 upn 필드 |
N/A |
| 액세스 토큰의 다른 필드 | email_attribute_path 설정 |
OAuth2 제공자의 /emails 엔드포인트(api_url로 구성된 URL에 /emails를 붙여 얻음)에서 primary로 표시된 이메일 |
N/A |
리프레시 토큰 구성 (Configure a refresh token)
사용자가 OAuth2 제공자로 로그인하면 Grafana는 액세스 토큰이 만료되지 않았는지 확인해요. 액세스 토큰이 만료되면 Grafana는 제공된 리프레시 토큰(존재한다면)으로 새 액세스 토큰을 얻어요. 리프레시 토큰이 없으면 액세스 토큰이 만료된 후 사용자를 시스템에서 로그아웃시켜요.
Generic OAuth가 리프레시 토큰을 사용하도록 use_refresh_token을 true로 설정하고, 필요하면 다음 중 하나 또는 둘 다를 수행해요.
- 구성 파일
[auth.generic_oauth]섹션의scopes필드를 추가 스코프로 확장. - 제공자에서 리프레시 토큰 활성화.
참고:
accessTokenExpirationCheckfeature toggle은 Grafana v10.3.0에서 제거됐으며, 대신use_refresh_token구성 값을 리프레시 토큰 가져오기와 액세스 토큰 만료 검사 구성에 사용해요.
JWT ID 토큰 검증 구성 (Configure JWT ID token validation)
기본적으로 Grafana는 ID 토큰에서 사용자 정보를 추출할 때 암호화 서명을 검증하지 않아요. 보안을 강화하려면 JWT 서명 검증을 활성화해 ID 토큰이 진짜이고 변조되지 않았는지 확인할 수 있어요.
- 구성 파일
[auth.generic_oauth]섹션에서validate_id_token을true로 설정. jwk_set_url을 OAuth2 제공자의 JWKS(JSON Web Key Set) 엔드포인트 URL로 구성. 이 엔드포인트는 JWT 서명 검증용 공개 키를 제공.- 일반적인 JWKS 엔드포인트 위치:
- OIDC 제공자:
https://<domain>/.well-known/jwks.json - Auth0:
https://<domain>.auth0.com/.well-known/jwks.json - Keycloak:
https://<domain>/realms/<realm>/.well-known/openid-configuration(jwks_uri포함)
- OIDC 제공자:
예시 구성:
[auth.generic_oauth]
enabled = true
validate_id_token = true
jwk_set_url = https://your-provider.com/.well-known/jwks.json
client_id = <client-id>
client_secret = <client-secret>
auth_url = https://your-provider.com/authorize
token_url = https://your-provider.com/token
api_url = https://your-provider.com/userinfo
참고: JWT 검증이 활성화되면 Grafana는 성능 향상을 위해 JWKS 키를 캐시해요. 캐시는 JWKS 엔드포인트 응답의
Cache-Control헤더를 존중해요. 캐시 만료가 지정되지 않으면 키는 기본 5분 동안 캐시돼요.
⚠️ 주의:
validate_id_token이true면jwk_set_url을 반드시 구성해야 해요. JWK Set URL이 제공되지 않거나 ID 토큰 서명을 검증할 수 없으면 인증이 실패해요.
역할 매핑 구성 (Configure role mapping)
skip_org_role_sync 옵션이 활성화되지 않은 한, 사용자의 역할은 로그인 시 인증 제공자에서 검색된 역할로 설정돼요. role_attribute_path 구성 옵션의 JMESPath 표현식으로 사용자 역할을 검색해요. Grafana는 먼저 OAuth2 ID 토큰으로 표현식을 평가하고, 역할을 찾지 못하면 UserInfo 엔드포인트의 사용자 정보로, 그래도 없으면 액세스 토큰으로 평가해요. 서버 관리자 역할을 매핑하려면 allow_assign_grafana_admin 옵션을 사용해요.
유효한 역할을 찾지 못하면 auto_assign_org_role 옵션에 지정된 역할이 할당돼요. role_attribute_strict = true로 설정하면 role_attribute_path와 org_mapping 표현식을 평가한 후 역할이 없거나 유효하지 않으면 사용자 접근을 거부해요.
org_attribute_path와 org_mapping 구성 옵션으로 사용자를 조직에 할당하고 역할을 지정할 수 있어요. org role 매핑과 일반 role 매핑을 모두 지정하면 사용자는 두 매핑된 역할 중 더 높은 역할을 받아요. JMESPath 표현식 구성에 도움을 받으려면 JMESPath에서 커스텀 페이로드로 표현식을 테스트·평가할 수 있어요.
참고:
org_attribute_path를 사용할 때 JMESPath 표현식이 반환하는 값은 문자열이 아닌 배열이어야 해요.
역할 매핑 예시 (Role mapping examples)
사용자 조직 역할 매핑:
이 예시에서 사용자는 Editor 역할을 받아요. 할당된 역할은 role 속성의 값에 기반하며, 이 값은 Admin, Editor, Viewer, None 같은 유효한 Grafana 역할이어야 해요.
{
...
"role": "Editor",
...
}
role_attribute_path = role
다음 더 복잡한 예시에서 사용자는 OAuth2 제공자의 admin 그룹 구성원이므로 Admin 역할을 받아요. editor 그룹 구성원이면 Editor, 그 외에는 Viewer를 받아요.
{
...
"groups": [
"engineer",
"admin",
],
...
}
role_attribute_path = contains(groups[*], 'admin') && 'Admin' || contains(groups[*], 'editor') && 'Editor' || 'Viewer'
서버 관리자 역할 매핑:
다음 예시에서 사용자는 Grafana 서버 관리자 역할을 받아요.
{
...
"roles": [
"admin",
],
...
}
role_attribute_path = contains(roles[*], 'admin') && 'GrafanaAdmin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'
allow_assign_grafana_admin = true
모든 사용자에게 하나의 역할 매핑:
다음 예시에서 모든 사용자는 IdP에서 받은 사용자 정보와 무관하게 Viewer 역할이 할당돼요.
role_attribute_path = "'Viewer'"
skip_org_role_sync = false
Org 역할 매핑 (Org roles mapping)
org_mapping 필드는 공백 또는 콤마 구분된 "ExternalName:OrgIdOrName:Role" 매핑 목록을 받아요. ExternalName 또는 OrgIdOrName를 *로 대체해 match any로 사용할 수 있어요. 부분 일치는 *를 이름의 일부로 취급해요(예: *-org는 my-org와 일치하지 않음).
Org 역할 매핑 예시:
이 예시에서 사용자는 org_foo 조직에서 Viewer 역할을, org_bar와 org_baz 조직에서 Editor 역할을 받아요. 사용자가 admin 그룹 구성원이면 Grafana 서버 관리자 역할을 받아요.
{
"roles": ["org_foo", "org_bar", "another_org"]
}
role_attribute_path = contains(roles[*], 'admin') && 'GrafanaAdmin' || 'None'
allow_assign_grafana_admin = true
org_attribute_path = roles
org_mapping = org_foo:org_foo:Viewer org_bar:org_bar:Editor *:org_baz:Editor
팀 동기화 구성 (Configure team synchronization)
참고: Grafana Enterprise와 선택된 Grafana Cloud 플랜 고객에게 제공돼요.
Team Sync를 사용하면 OAuth2 그룹을 Grafana 내 팀과 연결해 사용자를 적절한 팀에 자동 할당할 수 있어요. 각 사용자의 팀은 로그인할 때 동기화돼요. Generic OAuth 그룹은 8bab1c86-8fba-33e5-2089-1d1c80ec267d 같은 그룹 ID 또는 myteam으로 참조할 수 있어요. groups_attribute_path 구성 옵션으로 OAuth2 그룹을 구성하는 방법은 구성 옵션 문서를 참고하세요. Team Sync에 대한 자세한 내용은 Configure team sync 문서를 참고하세요.
팀 동기화 예시:
groups_attribute_path = groups
{
...
"groups": [
"engineers",
"analysts",
],
...
}
구성 옵션 (Configuration options)
다음 표는 다양한 Generic OAuth 구성 옵션을 요약해요. 다른 Grafana 구성과 마찬가지로 환경 변수로도 적용할 수 있어요.
참고: 콜론을 포함한 JMESPath 표현식이 필요한 옵션은 파싱 오류를 피하기 위해 표현식 전체를 따옴표로 감싸세요. 예:
role_attribute_path: "role:view".
| 설정 | 필수 | Cloud 지원 | 설명 | 기본값 |
|---|---|---|---|---|
enabled |
No | Yes | Generic OAuth 인증 활성화 | false |
name |
No | Yes | Grafana UI에서 Generic OAuth 인증을 참조하는 이름 | OAuth |
icon |
No | Yes | Generic OAuth 인증에 사용되는 아이콘 | signin |
client_id |
Yes | Yes | OAuth2 앱이 제공한 client ID | |
client_secret |
Yes | Yes | OAuth2 앱이 제공한 client secret | |
auth_url |
Yes | Yes | OAuth2 제공자의 인증 엔드포인트 | |
token_url |
Yes | Yes | OAuth2 액세스 토큰을 얻는 엔드포인트 | |
token_exchange_timeout |
No | Yes | OAuth 토큰 교환 요청의 시간 초과(초). 0이거나 미설정이면 15초 기본 |
15 |
api_url |
Yes | Yes | OpenID UserInfo 호환 사용자 정보를 얻는 엔드포인트 | |
auth_style |
No | Yes | ID 토큰 요청 시 사용할 OAuth2 AuthStyle 이름. AutoDetect, InParams, InHeader 값 지원 |
AutoDetect |
scopes |
No | Yes | 콤마 또는 공백 구분 OAuth2 스코프 목록 | user:email |
empty_scopes |
No | Yes | true면 인증 중 빈 스코프 사용 |
false |
allow_sign_up |
No | Yes | Generic OAuth 로그인을 통한 Grafana 사용자 생성 제어. false면 기존 사용자만 로그인 가능 |
true |
auto_login |
No | Yes | true면 로그인 화면을 건너뛰고 자동 로그인 |
false |
login_prompt |
No | Yes | IdP 로그인 시 사용자 상호작용 유형. login, consent, select_account 값 지원 |
|
id_token_attribute_name |
No | Yes | 반환된 OAuth2 토큰에서 ID 토큰을 추출하는 키 이름 | id_token |
login_attribute_path |
No | Yes | 사용자 ID 토큰에서 로그인 조회에 사용할 JMESPath 표현식 | |
name_attribute_path |
No | Yes | ID 토큰에서 사용자 이름 조회용 JMESPath 표현식 | |
email_attribute_path |
No | Yes | 사용자 정보에서 이메일 조회용 JMESPath 표현식 | |
email_attribute_name |
No | Yes | OAuth2 ID 토큰의 attributes 맵 내 이메일 조회용 키 이름 |
email:primary |
role_attribute_path |
No | Yes | Grafana 역할 조회용 JMESPath 표현식. 결과는 유효한 Grafana 역할(None, Viewer, Editor, Admin, GrafanaAdmin)이어야 함 |
|
role_attribute_strict |
No | Yes | role_attribute_path/org_mapping으로 org 역할을 추출할 수 없으면 로그인 거부 |
false |
skip_org_role_sync |
No | Yes | 사용자 역할 자동 동기화 중지. Grafana에서 수동으로 org 역할 설정 허용 | false |
org_attribute_path |
No | No | Grafana org→역할 조회용 JMESPath 표현식 | |
org_mapping |
No | No | 콤마/공백 구분 ExternalName:OrgIdOrName:Role 매핑. 값으로 *("모든 사용자") 가능. 역할은 None, Viewer, Editor, Admin |
|
allow_assign_grafana_admin |
No | No | true면 정규식으로 Grafana 서버 관리자 역할 자동 동기화 활성화 |
false |
groups_attribute_path |
No | Yes | 사용자 그룹 조회용 JMESPath 표현식. 결과는 문자열 배열이어야 함 | |
allowed_groups |
No | Yes | 콤마/공백 구분 그룹 목록. 사용자는 최소 한 그룹 구성원이어야 로그인 가능. 구성하면 groups_attribute_path도 필수 |
|
allowed_organizations |
No | Yes | 콤마/공백 구분 조직 목록. 최소 한 조직 구성원이어야 로그인 | |
allowed_domains |
No | Yes | 콤마/공백 구분 도메인 목록. 최소 한 도메인에 속해야 로그인 | |
team_ids |
No | Yes | 팀 ID 문자열 목록. 설정 시 주어진 팀 중 하나의 구성원이어야 로그인. 구성하면 teams_url과 team_ids_attribute_path도 필수 |
|
team_ids_attribute_path |
No | Yes | teams_url 엔드포인트가 반환한 결과 내 Grafana 팀 ID 조회용 JMESPath 표현식 |
|
teams_url |
No | Yes | 팀 ID 쿼리용 URL. 미설정 시 기본값 /teams. 구성하면 team_ids_attribute_path도 필수 |
/teams |
tls_skip_verify_insecure |
No | No | true면 서버가 제시한 인증서와 호스트 이름을 수락. 테스트용으로만 사용 |
false |
tls_client_cert |
No | No | 인증서 경로 | |
tls_client_key |
No | No | 키 경로 | |
tls_client_ca |
No | No | 신뢰할 CA 목록 경로 | |
use_pkce |
No | Yes | true면 PKCE(Proof Key for Code Exchange) 사용. Grafana는 SHA256 기반 S256 챌린지와 128바이트(base64url 인코딩) code verifier 사용 |
false |
use_refresh_token |
No | Yes | true면 리프레시 토큰 사용 및 액세스 토큰 만료 확인 |
false |
validate_id_token |
No | Yes | true면 ID 토큰의 JWT 서명 검증 활성화. 활성화 시 jwk_set_url 필수 |
false |
jwk_set_url |
No | Yes | JWT ID 토큰 서명 검증용 JWKS 엔드포인트 URL. validate_id_token이 true일 때 필수 |
|
signout_redirect_url |
No | Yes | 사용자 로그아웃 후 리다이렉트할 URL |
Generic OAuth 설정 예시 (Examples of setting up Generic OAuth)
Descope로 OAuth2 설정:
- Descope Project를 만들고 Getting Started Wizard로 인증을 구성해요.
- 다른 플로우를 쓰려면 IdP Applications 메뉴에서 IdP 앱을 선택하고 Flow Hosting URL 쿼리 파라미터
?flow=sign-up-or-in을 수정해요. - Save를 클릭해요.
- Settings 탭의 값으로
[auth.generic_oauth]섹션을 업데이트해요. Client ID는 Project Settings에서, Client Secret(Descope Access Key)은 Access Keys에서 얻을 수 있어요.
[auth.generic_oauth]
enabled = true
allow_sign_up = true
auto_login = false
name = Descope
client_id = <client-id>
client_secret = <client-secret>
scopes = openid profile email descope.claims descope.custom_claims
auth_url = https://api.descope.com/oauth2/v1/authorize
token_url = https://api.descope.com/oauth2/v1/token
api_url = https://api.descope.com/oauth2/v1/userinfo
use_pkce = true
use_refresh_token = true
Auth0로 OAuth2 설정:
- 다음 파라미터로 Auth0 앱을 만들어요: Name: Grafana, Type: Regular Web Application.
- 앱의 Settings 탭에서 Allowed Callback URLs를
https://<grafana-domain>/login/generic_oauth로 설정하고 Save Changes를 클릭해요. - Settings 탭의 값으로
[auth.generic_oauth]섹션을 업데이트해요.
[auth.generic_oauth]
enabled = true
allow_sign_up = true
auto_login = false
name = Auth0
client_id = <client-id>
client_secret = <client-secret>
scopes = openid profile email offline_access
auth_url = https://<domain>/authorize
token_url = https://<domain>/oauth/token
api_url = https://<domain>/userinfo
use_pkce = true
use_refresh_token = true
참고: Grafana는 현재 Auth0 "audience" 기능을 지원하지 않아요.
Bitbucket으로 OAuth2 설정:
- BitBucket에서 Settings > Workspace setting > OAuth consumers로 이동해요.
- Add consumer를 선택하고 Allowed Callback URLs를
https://<grafana-domain>/login/generic_oauth로 설정해 앱을 만들어요. - Save를 클릭해요.
- consumer 설명의
Key와Secret값으로[auth.generic_oauth]섹션을 업데이트해요.
[auth.generic_oauth]
name = BitBucket
enabled = true
allow_sign_up = true
auto_login = false
client_id = <key>
client_secret = <secret>
scopes = account email
auth_url = https://bitbucket.org/site/oauth2/authorize
token_url = https://bitbucket.org/site/oauth2/access_token
api_url = https://api.bitbucket.org/2.0/user
teams_url = https://api.bitbucket.org/2.0/user/permissions/workspaces
team_ids_attribute_path = values[*].workspace.slug
team_ids = <team-ids>
allowed_organizations =
use_refresh_token = true
OneLogin으로 OAuth2 설정:
- OneLogin에서 새 Custom Connector를 만들어요: Name: Grafana, Sign On Method: OpenID Connect, Redirect URI:
https://<grafana-domain>/login/generic_oauth, Signing Algorithm: RS256. - Grafana Connector에 앱을 추가해요(Display Name: Grafana).
- 앱 상세 페이지의 SSO 탭에서 client ID와 client secret으로
[auth.generic_oauth]섹션을 업데이트해요.
[auth.generic_oauth]
name = OneLogin
enabled = true
allow_sign_up = true
auto_login = false
client_id = <client-id>
client_secret = <client-secret>
scopes = openid email name
auth_url = https://<domain>.onelogin.com/oidc/2/auth
token_url = https://<domain>.onelogin.com/oidc/2/token
api_url = https://<domain>.onelogin.com/oidc/2/me
team_ids =
allowed_organizations =
Dex로 OAuth2 설정:
- Dex 구성 YAML 파일에 Grafana를 클라이언트로 추가해요.
staticClients:
- id: <client-id>
name: Grafana
secret: <client-secret>
redirectURIs:
- 'https://<grafana-domain>/login/generic_oauth'
Dex는
client_secret을 제공하지 않아openssl rand -hex 20으로 시크릿을 생성할 수 있어요.
[auth.generic_oauth]섹션을 업데이트해요.<dex-domain>은 Dex의issuer:구성에 해당해요.offline_access스코프는 리프레시 토큰 사용 시 필요해요.
[auth.generic_oauth]
name = Dex
enabled = true
client_id = <client-id>
client_secret = <client-secret>
scopes = openid email profile groups offline_access
auth_url = https://<dex-domain>/auth
token_url = https://<dex-domain>/token
api_url = https://<dex-domain>/userinfo