Data API Builder는 JWT(JSON Web Token) 유효성 검사를 사용하여 사용자 지정 인증 공급자를 통해 타사 ID 공급자를 지원합니다. 조직에서 Okta, Auth0 또는 다른 OAuth 2.0/OpenID Connect 규격 ID 공급자를 사용하는 경우 이 방법을 사용합니다.
인증 흐름
사용자 지정 ID 공급자를 사용하면 클라이언트 앱이 사용자 인증을 처리한 다음, 데이터 API 작성기로 액세스 토큰을 보냅니다.
| 단계 | 어떻게 되나요? |
|---|---|
| 사용자 인증 | 사용자가 ID 공급자(Okta, Auth0 등)를 통해 로그인합니다. |
| 토큰 획득 | 클라이언트 앱이 IdP에서 액세스 토큰을 받습니다. |
| API 호출 | 클라이언트가 Authorization 헤더에서 DAB로 토큰을 보냅니다. |
| 유효성 검사 | DAB는 JWT(발급자, 대상 그룹, 서명)의 유효성을 검사합니다. |
| 승인 | DAB는 역할을 추출하고 사용 권한을 평가합니다. |
사전 요구 사항
- ID 공급자가 있는 계정(Okta, Auth0 등)
- ID 공급자에 등록된 애플리케이션
- 설치된 데이터 API 작성기 CLI(설치 가이드)
- 기존
dab-config.json에 엔터티가 하나 이상 있는 항목
빠른 참조
| 설정 | 가치 |
|---|---|
| 공급자 | Custom |
| 유효성 검사에 필요 |
iss, aud, exp유효한 서명 |
| 권한 부여에 필요 |
roles 선택한 역할을 포함하는 클레임 |
| 토큰 헤더 | Authorization: Bearer <token> |
| 역할 클레임 유형 |
roles (수정됨, 구성할 수 없음) |
| 역할 선택 헤더 | X-MS-API-ROLE |
1단계: ID 공급자 구성
정확한 단계는 공급자에 따라 달라집니다. 필요한 키 값은 다음과 같습니다.
수집할 값
| 가치 | 찾는 위치 | 사용 용도 |
|---|---|---|
| 발급자 URL | 서비스 공급자의 설명서 또는 OAuth 메타데이터 엔드포인트 | DAB jwt.issuer (JWT 기관으로 사용) |
| 청중 | 애플리케이션의 클라이언트 ID 또는 사용자 지정 API 식별자 | 댑 jwt.audience |
메모
DAB는 구성된 jwt.issuer를 JWT 권한 서버로 사용합니다. 서명 키는 표준 OpenID Connect 메타데이터(일반적으로)를 통해 자동으로 검색됩니다 <issuer>/.well-known/openid-configuration.
Okta 예제
- Okta 관리 콘솔에 로그인합니다.
- 애플리케이션 애플리케이션>으로 이동합니다.
- 애플리케이션을 만들거나 선택합니다.
- 클라이언트 ID를 기록해 둡니다(대상 그룹으로 사용).
- 일반적으로 발급자는
https://<your-domain>.okta.com입니다.
Auth0 예제
- Auth0 대시보드에 로그인합니다.
- 애플리케이션 API로> 이동합니다.
- API를 만들거나 선택합니다.
- 식별자(대상 그룹으로 사용)를 적어둡니다.
- 귀하의 발급자는
https://<your-tenant>.auth0.com/입니다.
중요합니다
데이터 API 작성기에서는 역할 기반 권한 부여에 고정 클레임 유형을 roles 사용합니다. 이 값은 구성할 수 없습니다. ID 공급자가 다른 클레임(예: groups 또는 permissions)에서 역할을 내보내는 경우, roles 클레임도 함께 내보내도록 구성합니다. Auth0 사용자는 계속 진행하기 전에 알려진 네임스페이싱 충돌을 검토해야 합니다.
2단계: 데이터 API 작성기 구성
인증 공급자를 Custom 설정하고 JWT 설정을 구성합니다.
CLI
# Set the authentication provider
dab configure \
--runtime.host.authentication.provider Custom
# Set the expected audience
dab configure \
--runtime.host.authentication.jwt.audience "<your-api-identifier>"
# Set the expected issuer
dab configure \
--runtime.host.authentication.jwt.issuer "https://<your-issuer>/"
결과로 생성된 구성
{
"runtime": {
"host": {
"authentication": {
"provider": "Custom",
"jwt": {
"audience": "<your-api-identifier>",
"issuer": "https://<your-issuer>/"
}
}
}
}
}
3단계: 엔터티 권한 구성
ID 공급자가 할당하는 역할에 대한 권한을 정의합니다.
CLI
# Allow authenticated users to read
dab update Book \
--permissions "authenticated:read"
# Allow users with 'admin' role full access
dab update Book \
--permissions "admin:*"
결과로 생성된 구성
{
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "admin",
"actions": ["*"]
}
]
}
}
}
4단계: ID 공급자에서 역할 구성
DAB는 roles 클레임에서 역할을 기대합니다. 이 클레임을 포함하도록 ID 공급자를 구성합니다.
Okta: 역할로 그룹 추가
- Okta 관리 콘솔에서 보안>API로 이동합니다.
- 권한 부여 서버를 선택합니다.
- 클레임 탭으로 이동합니다.
- 클레임을 추가합니다.
-
이름:
roles - 토큰 유형에 포함: 액세스 토큰
- 값 형식: 그룹
- 필터: 포함할 그룹 선택
-
이름:
Auth0: 작업을 사용하여 역할 추가
Auth0에서는 사용자 지정 클레임에 네임스페이스가 지정된 충돌 방지 이름(예: https://example.com/roles)을 사용해야 합니다. 예약된 이름과 충돌하는 namespace가 없는 클레임은 별도의 알림 없이 토큰에서 제외됩니다. 자세한 내용은 Auth0 설명서에서 사용자 지정 클레임 만들기 를 참조하세요.
Data API 빌더는 네임스페이스가 지정된 변형이 아니라 정확한 클레임 이름 roles을 예상합니다. Auth0에서 이름이 지정되지 roles 않은 클레임을 허용하는지 여부는 테넌트 구성에 따라 달라집니다.
Auth0 대시보드에서 작업>라이브러리로 이동합니다.
새 작업(로그인 후 트리거)을 만듭니다.
역할을 포함하는 코드를 추가합니다.
exports.onExecutePostLogin = async (event, api) => { const roles = event.authorization?.roles || []; if (roles.length > 0) { api.accessToken.setCustomClaim('roles', roles); } };작업을 배포하고 로그인 흐름에 추가합니다.
jwt.io디코딩된 액세스 토큰을 확인하고 클레임이
roles있는지 확인합니다.
Warning
Auth0은 테넌트 설정에 따라 이름이 지정되지 않은 roles 클레임을 자동으로 삭제할 수 있습니다. 토큰에서 클레임이 누락된 경우 Auth0 대시보드의 고급 설정>에서 네임스페이스 적용을 확인합니다. 이름 표시 클레임이 필요한 테넌트는 현재 사용자 지정 역할에 대한 데이터 API 작성기 역할 기반 권한 부여와 호환되지 않습니다. 기본 제공 authenticated 및 anonymous 역할은 roles 클레임에 의존하지 않으므로 여전히 작동합니다.
팁 (조언)
Okta를 사용하여 JWT 클레임을 구성하는 방법에 대한 자세한 지침은 Okta에서 반환된 토큰 사용자 지정을 참조하세요.
5단계: 구성 테스트
데이터 API 작성기 시작:
dab startID 공급자로부터 토큰을 획득합니다. 공급자의 SDK 또는 Postman과 같은 도구를 사용합니다.
jwt.io 토큰을 검사하여 다음을 확인합니다.
- 클레임이
aud구성된 대상과 일치 - 클레임이 구성된 발급자
iss와 일치합니다. - 클레임에
roles예상 값이 포함되어 있습니다.
- 클레임이
API를 호출합니다.
curl -X GET "http://localhost:5000/api/Book" \ -H "Authorization: Bearer <your-token>"사용자 지정 역할을 사용하려면 헤더를 포함합니다.
X-MS-API-ROLEcurl -X GET "http://localhost:5000/api/Book" \ -H "Authorization: Bearer <your-token>" \ -H "X-MS-API-ROLE: admin"
JWT 유효성 검사 세부 정보
데이터 API 작성기에서는 JWT의 이러한 측면의 유효성을 검사합니다.
| 확인 | 설명 |
|---|---|
| 서명 | 구성된 jwt.issuer 기관을 통해 검색된 서명 키를 사용하여 유효성 검사(OpenID Connect 메타데이터 또는 JWKS(JSON 웹 키 집합)) |
| 발급자 | 구성과 정확히 일치 jwt.issuer 해야 합니다. |
| 청중 | 구성과 정확히 일치 jwt.audience 해야 합니다. |
| 만료 | 토큰이 만료되어서는 안 됩니다(exp 클레임) |
| 이전에는 유효하지 않음 | 토큰은 유효해야 합니다(nbf 클레임이 있는 경우). |
Troubleshooting
| 증상 | 가능한 원인 | 해결 방법 |
|---|---|---|
401 Unauthorized |
발급자 불일치 |
iss 클레임이 정확히 일치하는지 확인하세요 (후행 슬래시 포함). |
401 Unauthorized |
대상 그룹 불일치 | 클레임이 aud 구성된 값과 일치하는지 확인합니다. |
401 Unauthorized |
토큰 만료됨 | 새 토큰 획득 |
401 Unauthorized |
메타데이터를 사용할 수 없음 | DAB에 연결할 수 있는지 확인 <issuer>/.well-known/openid-configuration |
403 Forbidden |
토큰에 없는 역할 | IdP 구성에 역할 추가 |
403 Forbidden |
클레임을 찾을 수 없음 roles |
IdP를 roles 클레임을 포함하도록 구성 |
403 Forbidden |
잘못된 클레임 이름 | DAB는 클레임 형식 roles 을 사용합니다(수정됨, 구성할 수 없음) |
403 Forbidden |
Auth0 사용자 지정 클레임이 자동으로 삭제됨 | Auth0은 이름이 지정되지 않은 사용자 지정 클레임을 삭제할 수 있습니다. 클레임이 rolesjwt.io 디코딩된 토큰에 있는지 확인합니다.
Auth0 참조: 작업을 사용하여 역할 추가 |
중요합니다
클레임 유형 roles 은 모든 역할 검사에 대해 하드 코딩되며 변경할 수 없습니다. 정확히 명명된 클레임을 내보내도록 ID 공급자를 구성합니다 roles. Auth0 사용자는 이름 간격 충돌을 검토해야 합니다.
일반적인 발급자 형식
| 공급자 | 발급자 형식 |
|---|---|
| 옥타 주 |
https://<domain>.okta.com 또는 https://<domain>.okta.com/oauth2/default |
| Auth0 |
https://<tenant>.auth0.com/ (후행 슬래시에 유의) |
| Azure AD B2C | https://<tenant>.b2clogin.com/<tenant-id>/v2.0/ |
| 키클로크 주 | https://<host>/realms/<realm> |
전체 구성 예제
Okta 구성
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "@env('SQL_CONNECTION_STRING')"
},
"runtime": {
"host": {
"authentication": {
"provider": "Custom",
"jwt": {
"audience": "0oa1234567890abcdef",
"issuer": "https://dev-12345.okta.com"
}
}
}
},
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "editor",
"actions": ["create", "read", "update"]
}
]
}
}
}
Auth0 구성
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "@env('SQL_CONNECTION_STRING')"
},
"runtime": {
"host": {
"authentication": {
"provider": "Custom",
"jwt": {
"audience": "https://my-api.example.com",
"issuer": "https://my-tenant.auth0.com/"
}
}
}
},
"entities": {
"Book": {
"source": "dbo.Books",
"permissions": [
{
"role": "authenticated",
"actions": ["read"]
},
{
"role": "admin",
"actions": ["*"]
}
]
}
}
}