2026년 11월 13일 금요일

Authentik API 로 만든 OAuth2 Provider 가 invalid_request 를 낼 때 — grant_types 빈 배열

Authentik 의 관리 화면 대신 REST API 로 OAuth2 Provider 를 만들었더니, 로그인 시도마다 클라이언트가 invalid_request 를 받았다. 설정을 아무리 봐도 틀린 데가 없었는데, API 로 만들 때만 비어 있는 필드가 하나 있었다.

증상

  • POST /api/v3/providers/oauth2/ 로 Provider 를 만들고 Application 에 연결했다(Authentik 2026.5).
  • 앱에서 로그인 버튼을 누르면 authorize 단계에서 곧바로 콜백으로 돌아오며 error=invalid_request, 설명은 "The request is otherwise malformed".
  • client_id, redirect URI, scope 는 전부 맞다. 관리 화면에서 같은 값으로 만든 Provider 는 잘 된다.

원인

Authentik 서버 로그에는 클라이언트가 받은 것과 다른, 더 구체적인 메시지가 있었다.

Invalid grant_type for provider

API 로 만든 Provider 를 조회해 보니 grant_types 가 빈 배열이었다. 관리 화면은 기본값을 채워 주지만, API 는 요청 본문에 없으면 비워 둔 채로 만든다. 허용된 grant 가 하나도 없으니 authorization code 요청이 거부되고, 클라이언트에는 뭉뚱그린 invalid_request 로 전달된 것이다.

해결

생성 요청 본문에 넣거나, 이미 만든 Provider 를 PATCH 한다.

PATCH /api/v3/providers/oauth2/<pk>/
{
  "grant_types": ["authorization_code", "refresh_token"]
}

API 로 만들 때 함께 챙겨야 했던 필드들도 적어 둔다.

  • redirect_uris 는 문자열이 아니라 객체 배열이다: [{"matching_mode": "strict", "url": "https://app.example.com/callback"}]
  • authorization_flow, invalidation_flow, signing_key 는 각각의 pk 를 넣어야 한다. 기존에 잘 동작하는 Provider 를 GET 해서 값을 참고하면 빠르다.
  • property_mappings 에 openid, email, profile scope 매핑의 pk 를 넣는다. 그룹 정보는 profile scope 에 들어 있다.

정리

OAuth 오류는 클라이언트에 전달되는 메시지가 일부러 모호하다. invalid_request 를 받으면 요청을 의심하기 전에 인증 서버 쪽 로그를 먼저 본다. 그리고 UI 로 만든 것과 API 로 만든 것이 다르게 동작하면, 두 객체를 GET 해서 나란히 비교하는 것이 가장 빠르다.

댓글 없음:

댓글 쓰기

반도체 주식을 보기 전에 그려 두는 지도 — 설계, 파운드리, 메모리, 장비, 소재, 후공정

"반도체주"라고 한 묶음으로 부르지만, 그 안의 회사들은 하는 일도 돈 버는 방식도 전혀 다르다. 같은 뉴스에 어떤 회사는 오르고 어떤 회사는 내리는 이유가 여기에 있다. 종목을 들여다보기 전에 머릿속에 그려 두면 좋은 지도를 정리한...