我正在构建一个应用程序。客户端使用 Next.js
构建,后端使用 Django
和 Django REST framework
。
在此应用程序中,我想进行社交登录。
到目前为止,我的情况是这样。
next-auth
- 客户端成功调用 Google 并从那里获取访问令牌。dj_rest_auth
设置了后端 - 我的设置几乎与 the ones described here 相同。 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_token
和 refresh_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/
返回的令牌?非常感谢所有建议!