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 해서 나란히 비교하는 것이 가장 빠르다.
댓글 없음:
댓글 쓰기