Django-Oauth-Toolkit 사용 중 source_refresh_token_id, id_token_id duplicate key 문제
Django-Oauth-Toolkit를 이용해 인증을 구현하고 있다. a라는 계정으로 토큰을 생성하고 b라는 계정으로 토큰을 생성 하려는데 db 에러가 난다. a가 로그인 했으면 b도 로그인 되야 하는게 정상인데 에러가 발생한다. 에러 문구는 아래와 같다.
pymongo.errors.BulkWriteError: batch op errors occurred, full error: {'writeErrors': [{'index': 0, 'code': 11000, 'keyPattern': {'source_refresh_token_id': 1}, 'keyValue': {'source_refresh_token_id': None}, 'errmsg': 'E11000 duplicate key error collection: test.oauth2_provider_accesstoken index: source_refresh_token_id dup key: { source_refresh_token_id: null }', 'op': {'id': 29, 'user_id': ObjectId('63aa59667ef2477a5517c897'), 'source_refresh_token_id': None, 'token': 'GD8Uq4vupSPV2t0BbZ5D0joTbQrIhH', 'id_token_id': None, 'application_id': 1, 'expires': datetime.datetime(2022, 12, 27, 12, 52, 50, 819549), 'scope': 'read write groups', 'created': datetime.datetime(2022, 12, 27, 2, 52, 50, 820066), 'updated': datetime.datetime(2022, 12, 27, 2, 52, 50, 820081), '_id': ObjectId('63aa5e027ef2477a5517c8ac')}}], 'writeConcernErrors': [], 'nInserted': 0, 'nUpserted': 0, 'nMatched': 0, 'nModified': 0, 'nRemoved': 0, 'upserted': []}
source_refresh_token_id 의 값이 중복이라서 안 된다고 한다. 최초 토큰을 생성하면 oauth2_provider_accesstoken.source_refresh_token_id=null 값이 들어가는데 다른 토큰을 생성할 때도 null 로 넣으려고 하지만 db에 unique index가 걸려있으니 duplicate 에러가 난다.
Django-Oauth-Toolkit의 기본 튜토리얼을 따라한 것 뿐이고 구글링 해도 원인이 안 나온다. 깃헙 이슈를 찾아보디 2019년에 비슷한 이슈가 있었고 수정되었다고 나오는데 어째 똑같은 일이…
깃헙 이슈: https://github.com/jazzband/django-oauth-toolkit/issues/722
일단 source_refresh_token_id 인덱스를 제거해 줬다. 그런데 이것 말고도 id_token_id 라는 인덱스도 걸려있는데 이것도 unique 이고 기본값이 null로 들어가는지라 똑같은 문제를 발생시킨다. 인덱스 두 개를 지워줘야 한다.
이것만 문제인가? oauth2_provider_refreshtoken 테이블에 가면 access_token_id_1 이라는 unique 인덱스가 있고 default=null 이라 revoke_token 할 때 또 문제를 일으킨다. 이 index도 지워줘야 한다.
일단 문제되는 인덱스를 지우면 해결은 되지만 default로 세팅된 index 값을 지워서 해결하는게 꺼림칙하다. 또 id_token_id 라는 필드는 어디에 쓰이는건지 찾아봐도 알 수가 없다. 자체 버그인건지 내가 뭘 잘못한건지 알 수가 있나.
깃헙 이슈에 물어보고 후속 내용을 기록하겠다.