You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用Google登录后访问APIView出现未授权错误求助

解决Django Google登录后API视图未授权问题

看起来你遇到的问题是Google登录成功但API视图无法识别认证凭据,这通常是因为视图没有配置对应的认证类,或者请求时没有携带正确的token导致的。我来一步步帮你排查解决:

1. 给API视图添加认证与权限类

默认的APIView不会自动启用OAuth2认证,你需要显式指定认证类和权限类,告诉DRF要验证请求中的OAuth2 token:

from rest_framework.authentication import OAuth2Authentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ldata(APIView):
    # 指定使用OAuth2认证
    authentication_classes = [OAuth2Authentication]
    # 要求用户必须已认证才能访问
    permission_classes = [IsAuthenticated]

    def get(self, request):
        # 可以打印request.user确认用户是否被正确识别
        print(request.user)
        data = "my name"
        return Response(data)

如果希望所有API都默认启用这个认证,可以在settings.py中全局配置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
        'rest_framework_social_oauth2.authentication.SocialAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

2. 确保请求携带正确的认证Token

Google登录成功后,你需要获取到access_token,并在请求API时带上它:

  • 请求头方式(推荐):在请求头中添加Authorization: Bearer <你的access_token>
  • URL参数方式:在API URL后追加?access_token=<你的access_token>

比如前端用fetch请求的示例:

fetch('/api/ldata/', {
    headers: {
        'Authorization': `Bearer ${accessToken}`
    }
})

3. 检查Settings中的关键配置

确认你的settings.py中以下配置是否正确:

  • 已添加必要的APP:
    INSTALLED_APPS = [
        # ...其他APP
        'rest_framework',
        'oauth2_provider',
        'social_django',
        'rest_framework_social_oauth2',
    ]
    
  • 认证后端配置正确:
    AUTHENTICATION_BACKENDS = (
        'rest_framework_social_oauth2.backends.DjangoOAuth2',
        'django.contrib.auth.backends.ModelBackend',
    )
    

4. 验证Token有效性

如果以上配置都正确,还是报错,可以临时在视图中调试:

def get(self, request):
    # 检查认证信息
    print(request.auth)  # 应该返回OAuth2AccessToken对象
    print(request.user)  # 应该返回登录的用户对象,而不是AnonymousUser
    data = "my name"
    return Response(data)

如果request.user是AnonymousUser,说明请求中的token无效或者没有正确传递,需要检查token的获取流程是否正确。

内容的提问来源于stack exchange,提问作者msd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:19:44