Импорт ключа подписи и проверки для алгоритма JWT RSA в Django rest framework

#python #django #django-rest-framework #django-rest-framework-simplejwt

#python #django #django-rest-framework #django-rest-framework-simplejwt

Вопрос:

Я работаю над приложением django rest api, которое использует JWTAuthentication с использованием django-rest-framework-simplejwt. Поскольку используется алгоритм RSA, необходимо установить ключ подписи и проверки.

Приведенная ниже реализация сработала для меня.

 SIMPLE_JWT = {
    'SIGNING_KEY': open('jwtRS256.key').read() if os.path.isfile('./jwtRS256.key') else None,
    'VERIFYING_KEY': open('jwtRS256.key.pub').read() if os.path.isfile('./jwtRS256.key.pub') else None,
}
 

После обновления до django 3 и запуска py -Wa manage.py test . Это некоторые из отображаемых предупреждающих сообщений.

 D:pathtosettings.py:398: ResourceWarning: unclosed file <_io.TextIOWrapper name='jwtRS256.key' mode='r' encoding='cp1252'>
  'SIGNING_KEY': open('jwtRS256.key').read() if os.path.isfile('./jwtRS256.key') else None,
ResourceWarning: Enable tracemalloc to get the object allocation traceback
D:pathto\settings.py:399: ResourceWarning: unclosed file <_io.TextIOWrapper name='jwtRS256.key.pub' mode='r' encoding='cp1252'>
  'VERIFYING_KEY': open('jwtRS256.key.pub').read() if os.path.isfile('./jwtRS256.key.pub') else None,
ResourceWarning: Enable tracemalloc to get the object allocation traceback
 

Я попробовал альтернативу для решения этой проблемы, но, похоже, она нарушает работу приложения при аутентификации пользователей. Это попытка решения.

 def get_file(file_url):
    if os.path.isfile(file_url):
        with open(file_url) as f:
            return f
            
    return None


SIMPLE_JWT = {
    'SIGNING_KEY': get_file('./jwtRS256.key'),
    'VERIFYING_KEY': get_file('./jwtRS256.key.pub')
}
 

Это не работает при попытке входа в систему и возвращает 500 с TypeError: Expecting a PEM-formatted key.

Ответ №1:

Мой плохой. Я забыл прочитать файл.

 def get_file(file_url):
    if os.path.isfile(file_url):
        with open(file_url) as f:
            return f.read()

    return None
 

Ответ №2:

вы можете попробовать так

 def get_file(file_url):
     file_path = os.path.join(settings.MEDIA_ROOT, file_url)    
     if os.path.exists(file_path):
        with open(file_path,'rb') as f:
            return f.read()

    return None