我正在 django 中开发一个 Web 应用程序,并且在实现 JWT 身份验证时遇到问题。我有一个 Django 应用程序,负责用户管理和身份验证。因此,当我在我的视图中对用户进行身份验证时,我必须将他重定向到另一个 django 应用程序中的主页。但问题是,当我对用户进行身份验证时,我创建一个 JWT 并将其传递给响应,以便用户的客户端可以存储它,但似乎在重定向时,客户端无法存储 JWT。 这是验证用户身份的视图:
def loginUser(request: HttpRequest):
"""
Request :
URL : /user/loginUser/
Method : POST
Content-type : application/x-www-form-urlencoded
Required informations :
-username
-password
Response :
Status : 302
Redirect url : /home
"""
if request.method != "POST":
return JsonResponse(
data={"error":"Bad request method."},
hearders={"Allow":"POST"},
status=405,
)
try:
username = request.POST["username"]
password = request.POST["password"]
except KeyError:
return redirect("/user/loginPage/?error=Missing informations")
user = authenticate(username=username, password=password)
if user != None:
exp = datetime.datetime.now() + datetime.timedelta(hours=3)
exp = int(exp.timestamp())
payload = {
"user_id":user.id,
"username":user.username,
"exp":exp
}
token = jwt.encode(payload=payload, key=JWT_KEY)
response = HttpResponse(status=302)
response["Location"] = "/home"
response["Authorization"] = "Bearer "+str(token)
return response
else:
return redirect("/user/loginPage/?error=Bad identifiers")
显而易见的解决方案就是不重定向,但这是我最不想做的事情,因为我想在代码中保持一致。另一个解决方案是不使用 JWT,但同样,这不是我想要的。我想过将令牌作为 url 参数,但我知道这在安全性方面并不理想。我没有任何其他想法,这就是我提到你的原因。感谢您抽出时间来听我讲话。
感谢亚历山大席勒曼斯的回复。我想出了一个简单的解决方案,如果有人遇到这个问题,只需加密 JWT,然后将其作为 url 参数传递即可。这样,就不再有安全问题。
@Killian Jallais 您有加密 jwt 解决方案的示例代码实现细节吗?我想做类似的事情。