users/by-external/ API 엔드포인트가 인증 헤더 사용 시 실패, 헤더 없이 작동

3월 24일부터 Discourse API가 요청에 응답하는 방식에 변화가 생긴 것 같습니다.

우리 측에서는 코드 변경 사항이 없으며 Api-Key도 여전히 유효한 상태인데, 사용자 정보를 가져오려 시도하는 백엔드 서비스 중 하나가 users/by-external/{id}.json을 호출하기 시작하면서 실패하기 시작했습니다.

이 요청에는 문서에 따라 필수로 지정된 Api-Key와 Api-Username 헤더를 보내고 있습니다. 이러한 요청은 수년간 정상적으로 작동해 왔습니다.

하지만 현재 이 엔드포인트로 보내는 모든 요청이 403 오류와 함께 실패하며, 응답 본문은 다음과 같습니다:

{
    "errors": [
        "You are not permitted to view the requested resource."
    ],
    "error_type": "invalid_access"
}

/u/{username}.json을 요청할 때도 동일한 문제가 발생합니다.

놀랍게도 헤더를 보내지 않으면, 문서상 인증 헤더가 필요한 것으로 명시된 이 요청들이 실제로는 요청한 데이터를 반환합니다. 인증된 것처럼 동작하는 것입니다.

잘못된 Api-Key를 보내서도 테스트해 보았더니, 약간 다른 메시지와 함께 응답을 받았습니다:

{
    "errors": [
        "You are not permitted to view the requested resource. The API username or key is invalid."
    ],
    "error_type": "invalid_access"
}

이것은 키가 받아들여지고 있지만, 해당 리소스에 대한 액세스 권한이 없다고 잘못 보고하고 있으며, 동시에 인증되지 않은 요청에는 전체 액세스 권한을 부여하고 있음을 시사합니다.

또한 모든 사용자/글로벌 옵션이 설정된 완전히 새로운 Api-Key로 테스트해 보았지만, 동일한 결과를 얻었습니다.

4개의 좋아요

@Tim_Scaffidi와 함께 이 문제를 조사해 본 결과, Api-Username으로 전달된 사용자가 SiteSetting.invalidate_inactive_admin_email_after_days 설정에 의해 자동으로 비활성화되었음을 알게 되었습니다. 이 설정과 관련된 버그가 있을 가능성이 높으며, 사용자가 API 호출을 수행할 때 해당 사용자의 “로그인” 활동이 업데이트되지 않는 문제가 있는 것으로 보입니다.

7개의 좋아요

문제를 개선하기 위해 변경해야 할 코드가 있는지 다시 확인해 보았습니다. 하지만 이 문제는 “All Users” API 키가 사용되었기 때문에 발생한 것이므로, 코드 변경은 필요 없다고 생각합니다. 사용자 비활성화를 방지하는 최선의 방법은 “Single User” API 키를 사용하여 사용자 기록의 last_seen_at을 확인하려 하기보다 API 키 기록의 last_used_at을 확인하는 것입니다.

1개의 좋아요