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
相关产品推荐
相关产品推荐

