Django Rest中Djoser对接Google OAuth提示session value state缺失问题
解决Djoser Google OAuth "session value state is missing" 错误
问题根源
Djoser的Google OAuth后端要求state参数必须与用户发起授权请求时存储在session中的值一致。你的代码存在两个核心问题:
- 未在POST请求中携带用户的session Cookie,导致Djoser无法从对应session中读取初始生成的state值
- 可能跳过了Djoser的授权初始化流程,未让Djoser生成并存储state到session中
解决方案步骤
1. 走完整的授权流程
用户的授权必须先经过Djoser的初始化步骤:
- 引导用户访问Djoser的Google OAuth初始化接口:
GET /auth/o/google-oauth2/ - Djoser会自动生成
state值并存储到用户的session中,然后重定向到Google授权页面(已携带state参数) - 用户完成Google授权后,Google会重定向到你配置的
redirect_uri(即你的RedirectSocial视图地址)
2. 修改RedirectSocial视图代码
在POST请求到Djoser接口时,携带当前请求的session Cookie,让Djoser能读取到对应的state值:
class RedirectSocial(APIView): def get(self, request, *args, **kwargs): code = request.GET.get('code', '') state = request.GET.get('state', '') form_data = { 'code': code, 'state': state, 'client_id': '855150297727-frj54btbp93i1g50tglt5klg7g1jvug6.apps.googleusercontent.com', 'client_secret': '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', 'redirect_uri': 'https://7bfb-31-56-195-93.ngrok-free.app/google', 'grant_type': 'authorization_code', } # 关键:携带当前请求的session Cookie,让Djoser能读取到存储的state response = requests.post(API_URL, data=form_data, cookies=request.COOKIES) response_data = response.json() print(response_data) return Response(response_data)
3. 验证配置一致性
确保以下配置完全匹配:
form_data中的client_id/client_secret与Django settings中SOCIAL_AUTH_GOOGLE_OAUTH2_KEY/SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET一致redirect_uri与Google开发者控制台中配置的回调地址、Djoser设置的回调地址完全一致- 由于使用ngrok,需在settings中设置
SOCIAL_AUTH_REDIRECT_IS_HTTPS = True,避免HTTP/HTTPS不匹配导致的session问题
可选:直接使用Djoser内置的回调视图
如果不需要自定义逻辑,完全可以省略自己的RedirectSocial视图,直接将Google的回调地址配置为Djoser的内置回调接口:https://7bfb-31-56-195-93.ngrok-free.app/auth/o/google-oauth2/callback/,Djoser会自动处理code验证、token生成流程。
内容的提问来源于stack exchange,提问作者Parham Ahmarypour
相关产品推荐
相关产品推荐

