django-oauth-toolkit发布JWT令牌

pwuypxnk  于 2023-03-24  发布在  Go
关注(0)|答案(2)|浏览(144)

技术栈Django1.10.8 + Python3.6 + docker + React + Axios.js
我有一个情况,我需要进行服务器到服务器的调用,为此我使用Django-OAuth-toolkit。我如何将此令牌转换为颁发JWT令牌?
{“access_token”:“txxxxxxxxxxxxxxxxxxxxxFB45a”,“expires_in”:36000,“token_type”:“承载者”、“作用域”:“读写组”,“refresh_token”:“16oKxxxxxxxxxxxxxxxxxxxxx”}

{“access_token”:“xxxxxxxx.xxxxxx. xxxx”,“expires_in”:36000,“token_type”:“承载者”、“作用域”:“读写组”,“refresh_token”:“xxxxxxxx.xxxxxx.xxxxx”}
我已经通过了https://github.com/Humanitec/django-oauth-toolkit-jwt/,但我认为我使用的django-oauth-toolkit版本不兼容。

0x6upsns

0x6upsns1#

我通过子类化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字段更改为TextField,因为JWT长度将超过限制

from oauth2_provider.models import AbstractAccessToken, AbstractRefreshToken

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

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

django-oauth-toolkit docs将有更多关于覆盖django设置中这些字段的信息

jaql4c8m

jaql4c8m2#

因此,我还设法创建了一个自定义的JWT生成器,它分配JWT令牌而不是随机字符串令牌。您可以通过将以下内容添加到设置中来实现:

OAUTH2_PROVIDER = {
....
 "ACCESS_TOKEN_GENERATOR": "iam.oauth_token_generator.jwt_token_generator", # path to your custom JWT generator
...
}

现在的问题是,每当我尝试将该令牌用于受保护的资源/视图时,JWT令牌都不起作用。我已经尝试过使用随机访问令牌,它工作得很好。这不起作用:

Authorization: Bearer JWT_TOKEN

这样做效果很好:

Authorization: Bearer Random_String_AccessToken

有人能帮忙吗?

相关问题