带有 dj_rest_auth 的 Django REST 社交登录不会对用户进行身份验证

时间:2021-05-30 10:52:08

标签: django django-rest-framework oauth-2.0 django-authentication django-rest-auth

我正在构建一个应用程序。客户端使用 Next.js 构建,后端使用 DjangoDjango REST framework

在此应用程序中,我想进行社交登录。

到目前为止,我的情况是这样。

  1. 我已在 Google 信息中心设置了 OAuth
  2. 在客户端,我正在使用 next-auth - 客户端成功调用 Google 并从那里获取访​​问令牌。
  3. 在客户端上,从 Google 获取访问令牌后运行的回调会调用我的 Django API。
  4. 我使用 dj_rest_auth 设置了后端 - 我的设置几乎与 the ones described here 相同。
  5. 一旦客户端回调运行并使用来自 Google 的访问令牌调用我的 Django API,我就成功地在客户端上获得了访问令牌和刷新令牌。
  6. 如果是新用户第一次登录,会在Djangos DB中创建一个新用户
          const response = await fetch(`${djangoAPIurl}/api/social/login/google/`, {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json'
            },
            body: JSON.stringify({
              access_token: accessToken,
              id_token: idToken
            })
          });

          const data = await response.json();
          const { access_token, refresh_token } = data;

access_tokenrefresh_token 都已定义并且似乎是有效的标记。

到目前为止,一切都按预期进行。我的问题出现在这一点之后。

在我的 api 中,我定义了另一个视图。

@api_view(['GET'])
@authentication_classes([SessionAuthentication, BasicAuthentication, TokenAuthentication])
@permission_classes([IsAuthenticated])
def test_view(request):
    current_user = request.user
    print('current_user.auth: ', current_user.is_authenticated)
    response = JsonResponse({"received": True})
    return response

从我的客户那里,我试图以下列方式调用这个视图。

const response = await fetch(`${djangoAPIurl}/api/test/test_view/`, {
    headers: new Headers({
        Authorization: `Bearer ${session.accessToken}`
    })
});

header 构造正确,session.accessToken 是我从 api/social/login/google/ 调用中获得的值并且请求被正确路由,但是,它以 Forbidden 403 失败,因为用户未通过身份验证。我已经删除了身份验证和权限修饰符,请求最终由视图处理,并且在检查用户时,它是匿名用户。我也尝试将 Bearer 更改为 Token,但无济于事。

您对我可能做错或遗漏的事情有什么建议吗?我是否完全误解了如何使用从 api/social/login/google/ 返回的令牌?非常感谢所有建议!

0 个答案:

没有答案
相关问题