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

React前端与Django REST Framework后端集成Google登录认证遇400错误及相关技术咨询

React + Django REST Framework Google Login: 400 Bad Request, Missing Authorization Code

我正在搭建React前端 + Django REST Framework后端的Google登录认证功能,已经按照教程完成了前后端配置,但点击前端的Google登录按钮时,出现了POST http://127.0.0.1:8000/google-login/ 400 (Bad Request)错误。

调试后发现,Google返回的响应里没有授权码code(access token可以正常获取),我推测这可能是因为React的Google登录组件默认的responseType是permission而非code,但不确定只改这个配置能不能解决问题。

我的最终需求是把用户信息保存到数据库,并实现前端持久化登录,现在卡在获取Google返回的code这一步,想请教三个问题:

  1. 如何让Google返回授权码code?
  2. 我已经配置了Knox token,能不能用它替代JWT token?
  3. GoogleLogin(SocialLoginView)类是否会自动完成Google的access token/code验证、根据邮箱创建用户到数据库的流程?

下面是我的代码:

后端views.py

class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter
    callback_url = "http://localhost:3000"
    client_class = OAuth2Client

后端urls.py

path('google-login/', GoogleLogin.as_view(), name='google-login'),

前端/Components/login.js

const googleLogin = async (accesstoken,code) => {
    console.log(accesstoken)
    let res = await cacaDB.post(
        `google-login/`,
        { access_token: accesstoken, code: code }
    );
    console.log(res);
    return await res.status;
};
const responseGoogle = (response) => {
    console.log(response.code);
    googleLogin(response.accessToken, response.code);
}
return(
    <div className="App">
        <h1>LOGIN WITH GOOGLE</h1>
        <GoogleLogin clientId="client_id" buttonText="LOGIN WITH GOOGLE" onSuccess={responseGoogle} onFailure={responseGoogle} />
    </div>
)

解答

1. 如何让Google返回授权码code?

你猜的没错,React的react-google-login组件默认的responseType确实是permission,不会返回授权码。要获取code,你需要显式在组件上设置responseType="code"属性,同时建议加上accessType="offline"(这样可以获取刷新令牌,支持持久化登录)。

修改你的前端GoogleLogin组件代码:

<GoogleLogin 
  clientId="client_id" 
  buttonText="LOGIN WITH GOOGLE" 
  onSuccess={responseGoogle} 
  onFailure={responseGoogle}
  responseType="code"  // 新增这一行,指定返回授权码
  accessType="offline" // 可选,用于获取刷新令牌,支持长期登录
/>

另外要确保Google Cloud控制台里的OAuth 2.0客户端ID的授权回调URL和你后端设置的callback_url(http://localhost:3000)完全一致,否则Google会拒绝返回code。

2. Knox token完全可以替代JWT token

当然可以!Knox是DRF生态中专门的token认证库,相比JWT它更轻量,原生支持多令牌管理、令牌过期/吊销,非常适合持久化登录场景。

你只需要在GoogleLogin类里配置Knox的认证逻辑即可:

  • 首先确保已经安装并配置了django-rest-knox(比如在INSTALLED_APPS里添加knox,设置REST_FRAMEWORK的DEFAULT_AUTHENTICATION_CLASSES包含knox.auth.TokenAuthentication)
  • 自定义GoogleLogin的序列化器,让它返回Knox令牌:
from knox.models import AuthToken
from rest_framework import serializers

class KnoxSerializer(serializers.Serializer):
    token = serializers.CharField()
    user = serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.username

class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter
    callback_url = "http://localhost:3000"
    client_class = OAuth2Client
    serializer_class = KnoxSerializer

    def get_response(self):
        user = self.user
        token, _ = AuthToken.objects.create(user)
        return self.serializer_class({'token': token, 'user': user}).data

这样前端登录成功后就能拿到Knox的token,后续请求带上这个token即可完成认证。

3. GoogleLogin(SocialLoginView)会自动完成验证和用户创建流程

是的,只要你正确配置了相关参数,这个类会自动处理以下流程:

  1. 接收前端传来的access_token或code
  2. 向Google的认证服务器发起请求,验证令牌/授权码的有效性
  3. 获取Google返回的用户基本信息(邮箱、姓名等)
  4. 检查数据库中是否存在该邮箱的用户:
    • 如果不存在,自动创建一个新用户
    • 如果存在,直接关联该用户
  5. 返回认证后的令牌(默认是JWT,你可以改成Knox令牌)

需要注意的是,你需要在后端settings.py里配置Google OAuth2的密钥:

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '你的Google client ID'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '你的Google client secret'

同时确保你使用的GoogleOAuth2Adapter来自正确的库(比如rest_framework_social_oauth2或allauth.socialaccount.providers.google),配置正确的话整个流程会自动完成。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:54:08