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

如何将social_django与Strawberry GraphQL结合实现谷歌登录?

将social_django与Strawberry GraphQL配合实现谷歌登录

1. 基础配置(确保social_django正常工作)

先确认Django项目已完成social_django和谷歌OAuth2的基础配置:

  • 在INSTALLED_APPS中添加'social_django'
  • 在AUTHENTICATION_BACKENDS中配置认证后端:
    AUTHENTICATION_BACKENDS = [
        'social_core.backends.google.GoogleOAuth2',
        'django.contrib.auth.backends.ModelBackend',
    ]
    
  • 在settings中填入谷歌OAuth2密钥:
    SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '你的谷歌Client ID'
    SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '你的谷歌Client Secret'
    
    (GraphQL场景下SOCIAL_AUTH_LOGIN_REDIRECT_URL可设为任意值,不影响接口逻辑)

2. Strawberry GraphQL实现代码

替代你之前Graphene中的SocialAuthJWT实现,在Strawberry中可以这样编写:

首先导入依赖模块:

import strawberry
from social_core.backends.google import GoogleOAuth2
from social_core.exceptions import AuthFailed
from django.contrib.auth import get_user_model
from rest_framework_simplejwt.tokens import RefreshToken
from strawberry.types import Info
from strawberry.exceptions import GraphQLError

定义返回结果的类型结构:

@strawberry.type
class UserType:
    id: int
    username: str
    email: str
    is_verified: bool

@strawberry.type
class SocialAuthResult:
    user: UserType
    token: str

实现核心的登录Mutation:

@strawberry.type
class Mutation:
    @strawberry.mutation
    def social_auth_google(self, info: Info, code: str) -> SocialAuthResult:
        # 初始化谷歌OAuth2认证后端
        backend = GoogleOAuth2()
        try:
            # 通过前端传入的授权码获取social用户对象
            social_user = backend.do_auth(code, request=info.context.request)
            if not social_user:
                raise GraphQLError("无效的授权码")
            
            # 更新用户验证状态并保存
            user = social_user.user
            user.is_verified = True
            user.save()
            
            # 生成JWT访问令牌(如果用其他JWT库,替换此处逻辑即可)
            refresh_token = RefreshToken.for_user(user)
            access_token = str(refresh_token.access_token)
            
            # 组装结果返回
            return SocialAuthResult(
                user=UserType(
                    id=user.id,
                    username=user.username,
                    email=user.email,
                    is_verified=user.is_verified
                ),
                token=access_token
            )
        except AuthFailed as e:
            raise GraphQLError(f"授权失败: {str(e)}")

最后配置Strawberry Schema:

schema = strawberry.Schema(mutation=Mutation)

关键说明

  • 用backend.do_auth(code)直接处理谷歌授权码验证,替代Graphene中继承SocialAuthJWT的逻辑
  • 若你使用的JWT工具不是rest_framework_simplejwt,只需替换生成token的代码(比如原代码中的get_token)
  • 捕获AuthFailed异常并转为GraphQL错误,方便前端统一处理错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:15:40