django-oauth-инструментарий для выдачи токена JWT

#django #django-oauth

#django #django-oauth

Вопрос:

Технический стек Django1.10.8 Python3.6 docker React Axios.js

У меня ситуация, когда мне нужно выполнить вызов с сервера на сервер, и для этого я использую Django-OAuth-toolkit. Как я могу преобразовать этот токен для выдачи токена JWT вместо этого?

{ «access_token»: «txxxxxxxxxxxxxxxxxxxxxxfb45a», «expires_in»: 36000, «token_type»: «Bearer», «scope»: «группы чтения и записи», «refresh_token»: «16okxxxxxxxxxxxxxxxxxxxxxxxx» }

Для

{ «access_token»: «xxxxxxxx.xxxxxx.xxxxx», «expires_in»: 36000, «token_type»: «Bearer», «scope»: «группы чтения и записи», «refresh_token»: «xxxxxxxx.xxxxxx.xxxxx» }

Я прошел через https://github.com/Humanitec/django-oauth-toolkit-jwt но я думаю, что версия, которую я использую django-oauth-toolkit, несовместима.

Ответ №1:

Я решил это, создав подкласс oauthlib.oauth2.Server

 class OauthServer(oauth2.Server):
    def __init__(self, request_validator, token_expires_in=None, token_generator=None, *args, **kwargs):
        token_generator = custom_token_generator
        super().__init__(request_validator, token_expires_in, token_generator, *args, **kwargs)
  

custom_token_generator Функция сгенерирует токен jwt

 def custom_token_generator(request, refresh_token=False):
    client_code = request.user and request.user.client.codigo

    now = datetime.now()
    payload = {
        'iat': int(now.timestamp()),
        'exp': int(expires.timestamp()),
    }
    if client_code:
        payload['org'] = client_code
    return jwt.encode(payload, settings.JWT['EC_PRIVATE_KEY'].encode(), algorithm='ES256').decode('ascii')
  

Это не идеальный JWT, но вы можете создать то, что вам нужно, единственная проблема заключается в изменении полей accessToken и refreshToken token на текстовое поле, поскольку длина JWT значительно превысит лимит

 from oauth2_provider.models import AbstractAccessToken, AbstractRefreshToken

class AccessToken(AbstractAccessToken):
    token = models.TextField()

class RefreshToken(AbstractRefreshToken):
    token = models.TextField()
  

в документах django-oauth-toolkit будет больше информации о перезаписи этих полей в настройках django