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

Django Ninja是否有Django-Allauth同类工具?需实现Google SSO认证

在Django Ninja中实现Google SSO认证的方案

目前没有专门适配Django Ninja、功能完全对标Django-Allauth的工具,但可以结合Django生态中的成熟库,在Django Ninja中实现Google SSO认证,具体步骤如下:

1. 安装依赖库

先安装实现功能所需的基础库:

pip install django django-ninja django-oauth-toolkit requests

2. 配置Google OAuth应用

  • 前往Google Cloud Console创建OAuth 2.0客户端ID,设置授权回调URL为http://你的域名/api/auth/google/callback(根据实际域名和API路径调整)
  • 记录生成的客户端ID和客户端密钥

3. 配置Django项目

在项目的settings.py中添加以下配置:

INSTALLED_APPS = [
    # 项目默认应用
    'oauth2_provider',
    'ninja',
]

# OAuth2基础配置
OAUTH2_PROVIDER = {
    'ACCESS_TOKEN_EXPIRE_SECONDS': 3600,
    'AUTHORIZATION_CODE_EXPIRE_SECONDS': 600,
}

# Google OAuth参数
GOOGLE_CLIENT_ID = '你的Google客户端ID'
GOOGLE_CLIENT_SECRET = '你的Google客户端密钥'
GOOGLE_REDIRECT_URI = 'http://你的域名/api/auth/google/callback'
GOOGLE_TOKEN_URL = 'https://oauth2.googleapis.com/token'
GOOGLE_USER_INFO_URL = 'https://www.googleapis.com/oauth2/v3/userinfo'

4. 编写Django Ninja认证端点

创建api/auth.py文件,实现Google授权和回调逻辑:

from ninja import NinjaAPI, Schema
from django.http import HttpResponseRedirect
from django.contrib.auth import authenticate, login, get_user_model
import requests
from django.conf import settings
from oauth2_provider.models import Application, AccessToken

api = NinjaAPI(urls_namespace='auth')
User = get_user_model()

class TokenResponse(Schema):
    access_token: str
    token_type: str = "Bearer"

# 生成Google授权跳转链接
@api.get('/google/login')
def google_login(request):
    auth_url = (
        f"https://accounts.google.com/o/oauth2/v2/auth?response_type=code"
        f"&client_id={settings.GOOGLE_CLIENT_ID}"
        f"&redirect_uri={settings.GOOGLE_REDIRECT_URI}"
        f"&scope=openid%20email%20profile"
        f"&access_type=offline"
    )
    return HttpResponseRedirect(auth_url)

# 处理Google回调并生成访问令牌
@api.get('/google/callback', response=TokenResponse)
def google_callback(request, code: str):
    # 用授权码交换Google访问令牌
    token_data = {
        'code': code,
        'client_id': settings.GOOGLE_CLIENT_ID,
        'client_secret': settings.GOOGLE_CLIENT_SECRET,
        'redirect_uri': settings.GOOGLE_REDIRECT_URI,
        'grant_type': 'authorization_code'
    }
    token_response = requests.post(settings.GOOGLE_TOKEN_URL, data=token_data)
    token_json = token_response.json()
    google_access_token = token_json.get('access_token')

    # 获取Google用户信息
    user_info_response = requests.get(
        settings.GOOGLE_USER_INFO_URL,
        headers={'Authorization': f'Bearer {google_access_token}'}
    )
    user_info = user_info_response.json()
    email = user_info.get('email')
    name = user_info.get('name')

    # 创建或获取本地用户
    user, created = User.objects.get_or_create(email=email, defaults={'username': name})

    # 验证用户并生成Django OAuth2令牌
    django_user = authenticate(request, username=user.username)
    if django_user:
        login(request, django_user)
        # 需提前在Django后台创建OAuth2应用,替换为你的应用名称
        app = Application.objects.get(name='你的应用名称')
        access_token = AccessToken.objects.create(
            user=django_user,
            application=app,
            expires=AccessToken.get_expiry(),
            token=AccessToken.generate_token()
        )
        return {'access_token': access_token.token}

    return {'detail': '认证失败'}, 400

5. 配置URL路由

在项目根urls.py中添加认证API的路由:

from django.urls import path
from api.auth import api as auth_api

urlpatterns = [
    # 其他项目路由
    path('api/auth/', auth_api.urls),
]

额外提示

  • 若不需要完整的OAuth2服务器功能,可跳过django-oauth-toolkit,改用pyjwt库生成JWT令牌返回
  • 生产环境必须使用HTTPS,避免敏感数据泄露
  • 需补充错误处理逻辑,比如网络请求失败、用户信息缺失等异常场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:54:24