我目前有一个Django应用程序,它只是一堆REST API(当然是由数据库支持)。我正在使用Django REST framework JWT管理我的身份验证。它工作正常。每当用户登录时,我的一个API返回一个令牌,消费者应用程序存储该令牌供以后使用。到目前为止一切都很好。
但是,将来这个解决方案需要扩展。而不是让一台服务器运行Django应用程序,我可以预见到我需要多个Web服务器的情况。当然,所有这些Web服务器都将连接到同一个数据库。但由于令牌未存储在数据库中,因此如何使用多个Web服务器?一台服务器发出的令牌在另一台服务器上无效。
那么其他人如何解决这个问题?
答案 0 :(得分:4)
详细说明:
首先让我们了解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这样的云平台,那么事情会有所不同(配置方面),但两者都存在解决方案而且并不是非常困难。