如何使用多个Web服务器进行Django REST JWT身份验证?

时间:2014-09-30 17:25:27

标签: django rest django-rest-framework restful-authentication django-authentication

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

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

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

2 个答案:

答案 0 :(得分:4)

简而言之, NOT 需要担心使用JWT缩放

详细说明:

首先让我们了解Django-Rest-Framework(DRF)提供的默认令牌认证与DRF-JWT提供的令牌之间的实现差异

DRF提供的令牌

rest_framework.authentication.TokenAuthentication

令牌创建:

1)创建令牌

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

2)将步骤1中创建的令牌存储在数据库

3)将令牌返回给客户端

令牌身份验证:

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

2)如果令牌存在,则表示用户已通过身份验证

DRF-JWT提供的令牌

rest_framework_jwt.authentication.JSONWebTokenAuthentication

令牌创建:

1)创建令牌

body = base64encode(header)+"。" + base64encode(payload)

signature = HMACSHA256_encode(正文,' secret_key') #secret密钥通常在settings.py中指定

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

2)将令牌返回给客户端

令牌身份验证:

1)解码令牌

token_segment = token.split('。')

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

signature = token_segment [2]

decode_body = HMACSHA256_decode(签名,' secret_key')

2)如果decode_body等于body,则对用户进行身份验证

<强>结论

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

所以要回答你的问题,你不必担心缩放它:)

答案 1 :(得分:1)

取决于您认为数据库被击中的频率。我的第一直觉是缓存令牌并使用memcached。 Django对此有很好的支持。如果你使用的是像GAE / Python或AWS这样的云平台,那么事情会有所不同(配置方面),但两者都存在解决方案而且并不是非常困难。