logo
0
0
WeChat Login
feat/init-oauth2-connect

django-oauth2-connect

可插拔的 OAuth2 认证 Django 插件。类似 djangorestframework,通过 pip 安装并在 settings.py 中启用。

功能特性

  • 多 Provider 支持:可配置多个 OAuth2 服务提供商(GitHub、Google、WeChat 等)
  • 自动创建用户:首次 OAuth2 登录时自动创建 Django User
  • 自动更新用户信息:每次登录自动同步用户信息(邮箱、头像等)
  • 自动绑定用户组:不同 Provider 可配置不同的自动用户组
  • 灵活的字段映射:通过 JSON 路径映射 Provider 用户信息到 Django User 字段
  • Django Admin 管理:通过后台管理界面配置 OAuth2 Provider
  • 信号扩展:提供登录、创建、更新信号,方便扩展业务逻辑

安装

pip install django-oauth2-connect

快速开始

1. 配置 settings.py

# INSTALLED_APPS 中添加 INSTALLED_APPS = [ ... 'oauth2_connect', ] # AUTHENTICATION_BACKENDS 中添加(放在 ModelBackend 之前) AUTHENTICATION_BACKENDS = [ 'oauth2_connect.auth.OAuth2Backend', 'django.contrib.auth.backends.ModelBackend', ] # 添加 URL ROOT_URLCONF = [ ... path('oauth2/', include('oauth2_connect.urls')), ] # 可选配置 OAUTH2_CONNECT = { # 站点 URL(用于自动生成回调地址) 'SITE_URL': 'https://your-domain.com', # 登录成功后的重定向地址 'LOGIN_REDIRECT_URL': '/', # 登录失败时的重定向地址 'LOGIN_URL': '/oauth2/login/', }

2. 执行数据库迁移

python manage.py migrate

3. 在 Admin 后台添加 OAuth2 Provider

登录 Django Admin 后台,在「OAuth2 Providers」中添加 Provider 配置。

以 GitHub 为例:

配置项
NameGitHub
Sluggithub
Client ID(从 GitHub OAuth Apps 获取)
Client Secret(从 GitHub OAuth Apps 获取)
Authorize URLhttps://github.com/login/oauth/authorize
Token URLhttps://github.com/login/oauth/access_token
User Info URLhttps://api.github.com/user
Scoperead:user user:email
Unique ID Fieldid
Username Fieldlogin
Email Fieldemail

以 Google 为例:

配置项
NameGoogle
Sluggoogle
Client ID(从 Google Cloud Console 获取)
Client Secret(从 Google Cloud Console 获取)
Authorize URLhttps://accounts.google.com/o/oauth2/v2/auth
Token URLhttps://oauth2.googleapis.com/token
User Info URLhttps://www.googleapis.com/oauth2/v2/userinfo
Scopeopenid email profile
Unique ID Fieldid
Username Fieldname
Email Fieldemail
Avatar Fieldpicture

4. 访问登录页面

浏览器访问 /oauth2/login/,选择 OAuth2 Provider 进行登录。

OAuth2 流程

用户 → 点击「GitHub 登录」 → 重定向到 GitHub 授权页面 → 用户在 GitHub 同意授权 → GitHub 回调 /oauth2/callback/github/?code=xxx&state=yyy → 程序用 code 交换 access_token → 用 access_token 获取用户信息 → 创建/更新 Django User,建立关联 → 登录成功,重定向到首页

高级配置

用户组自动绑定

在 Admin 后台配置 Provider 的「Auto Groups」字段,选择用户登录后自动加入的用户组。

字段映射

extra_data_fields 支持将 Provider 用户信息中的任意字段映射到 Django User 模型字段:

{ "first_name": "first_name", "last_name": "last_name" }

监听信号

from oauth2_connect.signals import oauth2_user_login, oauth2_user_created def on_oauth2_login(sender, provider, user, user_info, request, **kwargs): print(f"用户 {user.username} 通过 {provider.name} 登录") def on_oauth2_created(sender, provider, user, user_info, request, **kwargs): print(f"新用户 {user.username} 通过 {provider.name} 注册") oauth2_user_login.connect(on_oauth2_login) oauth2_user_created.connect(on_oauth2_created)

自定义用户头像

如果项目的 User 模型有 avatar 字段,OAuth2 登录时会自动保存头像 URL。

API

视图

URL说明
/oauth2/login/登录选择页面,展示所有可用的 OAuth2 Provider
/oauth2/login/<slug>/发起 OAuth2 授权,重定向到 Provider 授权页面
/oauth2/callback/<slug>/OAuth2 回调地址,处理授权码并完成登录

信号

信号触发时机
oauth2_user_login用户通过 OAuth2 登录成功后
oauth2_user_created新用户首次通过 OAuth2 创建后
oauth2_user_updated用户信息更新后

模型

模型说明
OAuth2ProviderOAuth2 服务提供商配置
OAuth2User用户与 Provider 的关联记录

项目结构

oauth2_connect/ ├── __init__.py # 包初始化 ├── apps.py # Django App 配置 ├── models.py # 数据模型(OAuth2Provider, OAuth2User) ├── auth.py # Django 认证后端 ├── services.py # OAuth2 核心服务(授权、Token 交换、用户信息获取) ├── views.py # 登录页面视图 ├── urls.py # URL 路由配置 ├── admin.py # Django Admin 配置 ├── utils.py # 工具函数(JSON 路径提取、授权 URL 构建) ├── signals.py # 信号定义 ├── settings.py # 默认配置 ├── migrations/ # 数据库迁移 ├── templates/ # 模板文件 │ └── oauth2_connect/ │ └── login.html # 登录选择页面 └── locale/ # 国际化文件

运行测试

pip install -e ".[dev]" pytest

License

MIT

About

一个Django插件,为应用提供可插拔的标准Oauth2认证方式(非Provider)

148.00 KiB
0 forks0 stars2 branches0 TagREADMEMIT license
Language
Python90.9%
HTML9.1%