如何在重定向时为客户端提供 JWT?

问题描述 投票:0回答:2

我正在 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 参数,但我知道这在安全性方面并不理想。我没有任何其他想法,这就是我提到你的原因。感谢您抽出时间来听我讲话。

python django web django-views jwt
2个回答
0
投票

感谢亚历山大席勒曼斯的回复。我想出了一个简单的解决方案,如果有人遇到这个问题,只需加密 JWT,然后将其作为 url 参数传递即可。这样,就不再有安全问题。


0
投票

@Killian Jallais 您有加密 jwt 解决方案的示例代码实现细节吗?我想做类似的事情。

© www.soinside.com 2019 - 2024. All rights reserved.