如何将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密钥:
(GraphQL场景下SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '你的谷歌Client ID' SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '你的谷歌Client Secret'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
相关产品推荐
相关产品推荐

