如何使用React和Django进行用户令牌认证和存储



我想要实现的是一种安全且用户体验友好的方法来验证和存储用户的令牌。

  1. 正如这里所看到的,建议的答案建议使用一组必须具有安全和httpOnly属性的两个cookie(因为我有Django和React在不同的域,我将无法使用任何类型的相同的esite cookie)

  2. 在同样的问题中,下一个最佳答案建议使用Redux (Redux是否更安全?)将令牌存储在变量中,并使用存储在LocalStorage中的刷新令牌来刷新它,该刷新令牌将用于获取认证令牌。现在我看到的问题是,他提到他在他的解决方案中使用LocalStorage作为cookie对他的无状态方法并不好。如果我没弄错的话,cookie既不是有状态的也不是无状态的,它只是一个传输媒介,里面的东西是无状态的,比如Django用它的模板和会话认证做的sessionId。

  3. 我看到其他人建议使用httpOnly cookie和csrf令牌,这是我想采取的方法。我想让用户进行身份验证,如果找到用户,则在httpOnly cookie和csrf令牌中返回令牌,可以由js访问以防止攻击。这将有助于缓解我所担心的两个问题。此外,我必须实现刷新令牌,因为每次刷新页面时cookie都会丢失,而且我不希望用户每次刷新时都必须登录。这也是我认为发生在像SO或Instagram这样的页面,在cookie和LocalStorage中有令牌,所以它一定有什么好东西。

考虑到这一点和我提到的目标,我想知道从安全角度来看的最佳方法以及如何实现这一目标。我不希望代码的答案,因为我正在学习如何构建我的第一个应用程序,这可能会在现实世界中使用,我的安全是重要的。正如第2点的答案所提到的,尽管我的知识有限,但我没有看到只使用LocalStorage的教程,除了一个快速的应用程序外,没有给它太多的帮助。

到目前为止,这是我的API使用Knox的样子

class LoginViewAPI(generics.GenericAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [AllowAny]
serializer_class = LoginSerializer
@method_decorator(ensure_csrf_cookie)
def post(self, request):
serializer = LoginSerializer(data = request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data
response=None
if(user is None):
return Response({"message":"The user was not found"}, status=status.HTTP_404_NOT_FOUND)
else:
response=Response({"user": userSerializer(user, context=self.get_serializer_context()).data})
token = AuthToken.objects.create(user)[1]
response.set_cookie(
'auth_token', token, 
httponly=True,
)
return response

我仍然需要弄清楚csrf令牌部分,因为装饰器似乎没有完成它的工作。

首先,让我重申存储在cookie和localStorage中的令牌都容易受到XSS攻击。目前的最佳实践是将令牌存储在带有httpOnly和Secure cookie标志的cookie中。不幸的是,Django REST框架内置的TokenAuthentication非常基础。它不支持将令牌设置为过期,这是可以添加的安全性改进。每个用户只生成一个令牌,因此网站上的用户和之后的移动应用程序将使用相同的令牌。由于有关用户的信息存储在本地,这可能会导致维护和更新两组客户端信息时出现问题。

你可以使用JSON Web Tokens (JWTs),它是token的新增强版本,可以通过几个第三方包添加到Django REST框架中。jwt有几个优点,包括能够生成唯一的客户机令牌和令牌过期。它们既可以在服务器上生成,也可以使用Auth0等第三方服务生成。jwt可以加密,这使得它们在不安全的HTTP连接上发送更安全。

您的令牌应该存储在您的前端的本地存储中。

是。这是正确的。仅将令牌存储在HTTP cookie或服务器端将有助于降低诸如CSRF、XSS和客户端数据泄露等风险。关于您对本地存储攻击的立场,除了令牌之外,设备上没有存储任何凭据,如果需要,可以很容易地使其无效。您可以实现更安全的通信协议(例如HTTPS),并且定期轮换令牌可以进一步增强安全性。

相关内容

  • 没有找到相关文章

最新更新