#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