Auth0:如何使用M2M令牌和React Frontend

时间:2019-07-02 13:56:51

标签: django reactjs jwt token auth0

我无法找到使用Auth0的M2M令牌客户端证书流程流程集成工作POST请求提交的任何解决方案,无法从React前端向Django后端提交POST条目。

我目前完全基于以下设置进行了设置,其中Auth0已完全集成:

  1. 前端

    • 反应浏览器设置,使POST通过Auth0服务器检索AUTH0令牌。
    • 使用基于JWT身份验证的检索到的M2M令牌对浏览器设置进行响应,以执行GET请求以向后端发送数据。
  2. 后端

    • Django后端安装程序使用GET请求对M2M令牌进行身份验证以释放数据。

以上设置当前可以在没有任何Auth0实现的情况下正常运行,随后可以处理GET数据请求。但是,当我尝试发出POST数据请求时,该问题终于在最近弹出。


我确实意识到,根据我的设置,

  • 基于React的请求代码,
  • 通过M2M设置获取的
  • 已使用令牌,

在将有效的POST请求提交集成到Django后端时,我找不到任何解决方案。

let getBackendConfig = {
            headers: { 
                "Content-Type": "application/json",
                Authorization: process.env.REACT_APP_JWT_AUTH0_HEADER + " " + auth0Token,
            },
        };
async function submitLocationViaPOST( dataToPOST ) {
            setIsLocationUploaded("process");
            try {
                Promise.all([
                    await axios
                        .post(urlSubmitLocationPOSTAPI, dataToPOST, getBackendConfig)
                        .then(response => {
                            console.log("? urlSubmitLocationPOSTAPI Reply Data: ", response);
                            if (response.status === 201) {
                                // EXECUTE ONLY IF RESPONSE IS "201" --- MEANING ENTRY CREATED SUCCESSFULLY
                                setIsLocationUploaded("finish");
                            }
                        })
                ]);
            }
            catch (err) {
                setIsLocationUploaded("error");
                console.log("? urlSubmitLocationPOSTAPI Error: " + err);
            }
        }

我目前确实知道,如果没有任何Auth0身份验证,则当前的所有POST请求都将有效。

上面的代码是POST请求代码的示例,该代码先前在没有Auth0的情况下工作,并且在实施Auth0时突然引发了500错误,大概是抛出500错误是因为JWT身份验证配置可能被错误编码。我希望有人可以帮助查明我可以进行的潜在代码更改,以尝试通过Auth0 POST请求提交来纠正它:


希望能收到可以解决此问题的人的回音。提前非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

经过7天的测试后,我便进行了一系列尝试和测试,并找到了可行的工作答案。希望该解决方案可以在此过程中对其他人有所帮助。

但是,在此时此刻,我不得不说我只成功进行了1-3次测试,而该解决方案尚未经过严格测试。但是到目前为止,它可以完成所有的测试。


基本上,这是一些关键指标:

  1. 使用JWT令牌可以提交POST请求,只是有一种一种非常具体的方法可以使其正常工作
  2. 当' permission_classes((IsAuthenticated,))'和' authentication_classes((JSONWebTokenAuthentication,))'为'时,在基于Django Rest框架的服务器中使用类将无法正常工作。启用,但是如果您在后端使用Django,则在禁用它们时可以使用。
  3. 在views.py中使用 API_View 代码将是允许' permission_classes((IsAuthenticated,))'和' authentication_classes(( JSONWebTokenAuthentication,))'完全启用。
  4. 在带有AXIOS或FETCH的带有React Frontend的发送请求中,当您包含“ Content-Type”:“ application / x-www-form-urlencoded” 而不是POST请求标头中的“ Content-Type”:“ application / json”。

要注意的示例样本键代码:

A。前锋---反应

// HANDLES "POST" REQUESTS CONFIGS
        let postBackendConfig = {
            headers: { 
                "Content-Type": "application/x-www-form-urlencoded",
                Authorization: process.env.REACT_APP_JWT_AUTH0_HEADER + " " + auth0Token,
            },
        };

B。后端--- DJANGO REST FRAMEWORK

views.py

@csrf_exempt
@permission_classes((IsAuthenticated, ))
@authentication_classes((JSONWebTokenAuthentication,))
def newsubmission(request):
    if request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = SubmissionsSerializer(data=data)


        if serializer.is_valid():
            submitted = serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

要记录的最后一个关键项是发送/接收授权标头,这对于确保所有这些代码也能正常工作至关重要。

以下是您查看自己的代码的示例,因为它是个人在使用JWT令牌时面临的常见问题之一。我相信只要两端相同,无论是“ J​​WT”还是“ Bearer”,它仍然可以工作,但是强烈建议仅使用“ JWT”或“ Bearer”作为您的选择:


A。前锋---反应---发件人授权标头

Authorization: "JWT " + auth0Token,

B。后端--- DJANGO REST FRAMEWORK ---接收器授权标头


settings.py


# JWT settings
JWT_AUTH = {
    ...
    'JWT_AUTH_HEADER_PREFIX': "JWT",
    ...

}

我还要感谢@Dan Woda以前提供的帮助。