如何使用多个网络服务器使 Django REST JWT 身份验证扩展?

Saq*_*Ali 4 django rest restful-authentication django-authentication django-rest-framework

我目前有一个 Django 应用程序,它只是一堆 REST API(当然由数据库支持)。我正在使用Django REST framework JWT管理我的身份验证。它工作正常。每当用户登录时,我的 API 之一都会返回一个令牌,消费应用程序存储该令牌以供以后使用。到现在为止还挺好。

但是,将来,此解决方案需要扩展。而不是让单个服务器运行 Django 应用程序,我可以预见我需要多个 Web 服务器的情况。当然,所有这些网络服务器都将连接到同一个数据库。但是由于令牌未存储在数据库中,这将如何与多个 Web 服务器一起使用?一台服务器发出的令牌在另一台服务器上无效。

那么其他人是如何解决这个问题的呢??

Ang*_*iam 5

总之,你根本需要担心与智威汤逊缩放

详细说明:

首先来了解一下Django-Rest-Framework(DRF)提供的默认token认证和DRF-JWT提供的token的实现区别

DRF提供的Token

rest_framework.authentication.TokenAuthentication

令牌创建:

1) 创建令牌

Token.objects.create(用户=用户)

2)将step1创建的token存入数据库

3) 将令牌返回给客户端

令牌认证:

1)检查客户端传递的token是否存在数据库中

2)如果令牌存在,这意味着用户通过了身份验证

DRF-JWT 提供的Token

rest_framework_jwt.authentication.JSONWebTokenAuthentication

令牌创建:

1) 创建令牌

body = base64encode(header) + "." + base64encode(有效载荷)

signature = HMACSHA256_encode(body, 'secret_key') #secret key 通常在你的 settings.py 中指定

令牌 = 正文 + "." + 签名

2) 将令牌返回给客户端

令牌认证:

1)解码令牌

token_segment = token.split('.')

body = token_segment[0] + "." + token_segment[1]

签名 = token_segment[2]

decode_body = HMACSHA256_decode(签名,'secret_key')

2)如果decode_body等于body,则用户通过认证

结论

从上面的机制,我们可以安全地得出结论,JWT 方法更具可扩展性,因为它只依赖于 secret_key,并且每个 web 服务器都应该在 settings.py 下有 secret_key

因此,要回答您的问题,您无需担心缩放它:)


pbh*_*ick 1

取决于您认为数据库受到攻击的频率。我的第一反应是缓存令牌并使用 memcached。Django 对此有很好的支持。如果您使用的是 GAE/Python 或 AWS 等云平台,情况会略有不同(配置方面),但两者都存在解决方案,而且并不是非常困难。

  • 单一逻辑内存缓存。请记住,memcached 是一种分布式服务,是来自多个实例的单个虚拟内存池。查一下。 (2认同)