DjangoRestFramework 使用 python-social-auth 实现第三方登录

Django丨REST framework REST framework一、引入Django REST framework1.Web应用模式三级目录二、DRF工程搭建三、Serializer序列化器1.定义Serializer2.序列化使用3.反序列化使用4.模型类序列化器ModelSerializer四、视图五、其他功能 一、引入Django REST framework 1.Web应用模式 三级目录 二、DRF工程搭建 三、Serializer序列化器 1.定义Serializer 2.序列化使用 3.反序列化使用 4.模型类序列化器ModelS 阅读详情

本文为 social-auth-app-django 使用记录。(官方文档)

0. 前言

前提:有两个网站,记为网站A、网站B,两个网站有各自的用户系统,现在网站B要实现使网站A的用户无需注册直接登录自己的网站,这里就要用到第三方登录。

环境: Django == 3.x  social-auth-app-django == 4.0.0

1. 安装 

pip install social-auth-app-django

2. 使用

网站A 为该篇文章的 provider 项目,即 OAuth provider(提供方); 

创建 Django 项目(网站B),即 OAuth consumer(使用方),网站B目录树如下图:

├─manage.py
├─social
│  │  asgi.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  └─ __init__.py
└─users
   │  admin.py
   │  apps.py
   │  backends.py
   │  models.py
   │  tests.py
   │  views.py
   └─ __init__.py

并进行相关配置: 

# social/settings.py
INSTALLED_APPS = [
    ...
    'users',
    'social_django',    # add
]

SOCIAL_AUTH_ADMIN_USER_SEARCH_FIELDS = ['username', 'email']

# SOCIAL_AUTH_要使用登录模块的名称大写_KEY
# 登录模块名对应为第三步中自定义后端的 name 属性
SOCIAL_AUTH_DJANGO_KEY = 'local'
SOCIAL_AUTH_DJANGO_SECRET = 'local'

# 登录成功后跳转页面
LOGIN_REDIRECT_URL = '/admin/'        

# 获取授权码的标识
PARTIAL_PIPELINE_TOKEN_NAME = 'code'

AUTHENTICATION_BACKENDS = (
    'users.backends.djangoOauth2',                  # 自定义第三方登录认证
    'django.contrib.auth.backends.ModelBackend',    # django 默认登录认证
)

# 获取用户详细的信息
SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'social_core.pipeline.user.create_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                # add
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]


# social/urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('social_django.urls', namespace='social'))    # add
]

 3.自定义认证后端 

配置文件 settings.py 中的 AUTHENTICATION_BACKENDS 下自定义了一个 djangoOauth2,代码实现如下:

# users/backends.py
import requests
from social_core.backends.oauth import BaseOAuth2


class djangoOauth2(BaseOAuth2):
    name = 'django'    # 调用的第三方名称, 如 google
    AUTHORIZATION_URL = 'http://127.0.0.1:8000/o/authorize/'   # 获取授权码的路由
    ACCESS_TOKEN_URL = 'http://127.0.0.1:8000/o/token/'        # 获取 token 的路由      
    ACCESS_TOKEN_METHOD = 'POST'    # 获取 token 的请求方式
    RESPONSE_TYPE = 'code'
    REDIRECT_STATE = False
    STATE_PARAMETER = False
    EXTRA_DATA = [
        ('id', 'id'),
        ('username', 'username'),
    ]

    def get_user_details(self, response):
        """Return user details from Django siteA. """
        print('get_user_details')
        return response

    def user_data(self, access_token, response=None, *args, **kwargs):
        """Return user data"""
        # 本处使用了用户id获取用户详细信息
        # 由于网站A(provider)项目中返回的 token 信息并不包含 id 信息
        # 因此这里网站A 自定义了返回 token信息(代码见下)
        url = 'http://127.0.0.1:8000/users/{}'.format(response['id'])
        headers = {'Authorization': 'Bearer ' + access_token}
        user_data = self.get_json(
            url=url,
            method='GET',
            headers=headers
        )
        print(user_data)
        return user_data

注意:此处为网站A(provider)中自定义的 token 代码:

# provider/users/views.py
import json

from django.http import HttpResponse
from django.utils.decorators import method_decorator
from django.views.decorators.debug import sensitive_post_parameters
from oauth2_provider.models import get_access_token_model
from oauth2_provider.signals import app_authorized
from oauth2_provider.views import TokenView


class CustomTokenView(TokenView):
    """ 自定义返回令牌 """

    @method_decorator(sensitive_post_parameters("password"))
    def post(self, request, *args, **kwargs):
        url, headers, body, status = self.create_token_response(request)
        if status == 200:
            body = json.loads(body)
            access_token = body.get("access_token")
            if access_token is not None:
                token = get_access_token_model().objects.get(token=access_token)
                app_authorized.send(sender=self, request=request, token=token)
                body['id'] = token.user.id
                body = json.dumps(body)
        response = HttpResponse(content=body, status=status)

        for k, v in headers.items():
            response[k] = v
        return response

# provider/urls.py
import oauth2_provider.views as oauth2_views
from django.conf import settings
from django.contrib import admin
from django.urls import path, include

from users.views import UserList, UserDetails, CustomTokenView

# OAuth2 provider endpoints
oauth2_endpoint_views = [
    path('authorize/', oauth2_views.AuthorizationView.as_view(), name="authorize"),
    # 这里使用自定义 token 信息
    path('token/', CustomTokenView.as_view(), name="token"),    
    path('revoke_token/', oauth2_views.RevokeTokenView.as_view(), name="revoke-token"),
]

if settings.DEBUG:
    # OAuth2 Application Management endpoints
    oauth2_endpoint_views += [
        path('applications/', oauth2_views.ApplicationList.as_view(), name="list"),
        path('applications/register/', oauth2_views.ApplicationRegistration.as_view(), name="register"),
        path('applications/<pk>/', oauth2_views.ApplicationDetail.as_view(), name="detail"),
        path('applications/<pk>/delete/', oauth2_views.ApplicationDelete.as_view(), name="delete"),
        path('applications/<pk>/update/', oauth2_views.ApplicationUpdate.as_view(), name="update"),
    ]

    # OAuth2 Token Management endpoints
    oauth2_endpoint_views += [
        path('authorized-tokens/', oauth2_views.AuthorizedTokensListView.as_view(), name="authorized-token-list"),
        path('authorized-tokens/<pk>/delete/', oauth2_views.AuthorizedTokenDeleteView.as_view(),
             name="authorized-token-delete"),
    ]

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('o/',  include('oauth2_provider.urls', namespace='oauth2_provider')),  # before
    path('o/', include((oauth2_endpoint_views, 'oauth2_provider'), namespace="oauth2_provider")),  # now
    path('users/', UserList.as_view()),
    path('users/<pk>/', UserDetails.as_view()),
]

 4. 在网站A中注册网站B

注意:此时网站A在8000端口运行,网站B在8001端口运行。

网站B要想调用网站A登录,则需要在网站A中注册自己网站的信息,注册地址为:http://127.0.0.1:8000/o/applications/, 点击 New Applications 进行添加:

其中填写的 client_id 对应配置文件 settings.py 中的 SOCIAL_AUTH_DJANGO_KEY, client_secret 对应 SOCIAL_AUTH_DJANGO_SECRRT。

授权类型为授权码类型(authorization);

重定向地址为 http://127.0.0.1:8001/complete/django/,其中 8001 为网站B运行的端口,django 为自定义认证后端类中的 name。

5. 调用第三方登录

在浏览器中输入 http://127.0.0.1:8001/login/django/,

会发现重定向路由为 http://127.0.0.1:8000/o/authorize/?client_id=local&redirect_uri=http://127.0.0.1:8001/complete/django/&response_type=code,

输入网站A中的用户名及密码,点击授权(Authorize), 

会发现网址重定向到了 http://127.0.0.1:8001/admin/login/?next=/admin/,红字表示已经使用网站A中的 admin 用户登录成功,但是该用户没有访问该页面的权限(superuser才可以访问)。

 同时Pycharm中会输出:

 创建网站B的超级用户(social)并查看 http://127.0.0.1:8001/admin 界面:

DjangoRestFramework框架简介及基本使用 本文首发于:行者AI 在python项目开发中,前后端分离的技术框架越来越成熟,在前后端进行通信时,通常需要用统一的格式进行通信,目前应用比较广泛的是RESTful API。那后端如何快速编写基于Django的RESTful API呢?本篇将主要介绍使用DjangoRestFramework(drf)框架来快速开发符合REST风格的API。 1. drf概念及特点 1.1 概念 drf框架是基于Django框架,用于快速构建Web RESTful API的工具。 1.2 特点 (1) 提供了定义序列化器. 阅读详情

相关推荐

Django Rest Framework第三方登录

第三方登录已有大神为我们封装好了包,我们一起来学习怎么使用吧 1、首先安装 pip install social-auth-app-django 文档请看 https://python-social-auth.readthedocs.io/en/latest/configuration/django.html 2、在setting文件中 INSTALL_APP中加入 'social_...

吴先森的博客 1720

​ 一:drf --drf入门规范

目录一:web开发模式1.1 前后端不分离1.2 前后端分离二:API接口三:接口测试工具:Postman四:RESTful API规范restful十条规范1 数据的安全保障2 接口特征表现3 多数据版本共存4 (重点)数据即是资源,均使用名词(可复数)5 (重点)资源操作由请求方式决定(method)过滤,通过在url上传参的形式传递搜索条件7 响应状态码7.1 正常响应7.2 重定向响应7.3 客户端异常7.4 服务器异常8 错误处理,应返回错误信息,error当做key9 返回结果,针对不同操作,服

wmyzzz 1717

Django认证最佳实践:django-allauth快速集成与安全配置

用户认证是Web应用的基础能力,涉及注册、登录、邮箱验证、密码重置及社交登录等核心流程。其底层原理依赖于会话管理、Token签名、OAuth2协议和安全边界控制(如CSRF防护、开放重定向拦截)。采用成熟方案可显著降低安全风险与开发成本,避免因SMTP明文认证漏洞、回调URL配置错误或会话固定等问题引发线上事故。典型应用场景包括SaaS平台、教育系统、政务审批系统等需快速交付且符合等保要求的项目。django-allauth作为Django生态最成熟的认证扩展,无缝兼容django.contrib.auth

weixin_34318326的博客 448

djangorestframework全解

两个基类 APIViewGenericAPIView:有关数据库操作,queryset 和serializer_class #5个视图扩展类(rest_framework.mixins) CreateModelMixin:create方法创建一条DestroyModelMixin:destory方法删除一条ListModelMixin: list 方法获取所有RetrieveModelMixin:retrieve获取一条。

General_zy的博客 4954

Python大数据分析&人工智能教程 - Django-RestFramework框架(深入解析+实操案例)

Django-RestFramework(简称DRF)是一个强大的、灵活的工具集,用于构建Web API。它基于Django框架,允许开发者快速构建RESTful API。DRF的核心优势在于其提供了一系列工具,包括API的可视化、文档化、自动化测试以及自动化的API路由、序列化、视图、验证、分页、版本管理、认证等功能。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2069

Python库 | social-auth-app-django-mongoengine-1.0.0.tar.gz

资源分类:Python库 所属语言:Python 资源全名:social-auth-app-django-mongoengine-1.0.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.youkuaiyun.com/article/details/101784059

Django rest framework集成微博第三方登录

Django restframework 集成第三方登录(微博、微信、QQ等) 友情链接 python-social-auth-app官方文档 微博开放者平台 QQ开放者平台 准备工作 1.注册微博开放者平台并通过个人认证,创建一个网页应用。 2.在高级信息中编辑回掉url,可以填写本机的地址。 3.找到自己的app_key 和 App Secret并保存 4.准备一个django rest...

weixin_33943347的博客 282

PostgreSQL隐式类型转换全解析:告别operator does not exist

强类型数据库是现代数据系统的基石,它在带来严谨性的同时,也常常让开发者在类型不匹配报错前束手无策。当一条SQL因bigint与text比较而抛出operator does not exist时,根源往往在于对数据库隐式转换规则的误解。PostgreSQL通过pg_cast系统表将转换划分为隐式、赋值与显式三个级别,并依据操作符解析逻辑决定是否自动提升类型。理解这些机制,不仅能快速定位JOIN、UNION、函数调用等场景下的类型错误,还能帮助开发者合理使用EXPLAIN VERBOSE、pg_typeof等工

weixin_29587015的博客 304

推荐开源项目:DRF Social OAuth2 —— 简化社交认证与OAuth2集成

推荐开源项目:DRF Social OAuth2 —— 简化社交认证与OAuth2集成 drf-social-oauth2drf-social-oauth2 makes it easy to integrate Django social authentication with major OAuth2 providers, i.e., Facebook, Twitter, Google, et...

gitblog_00091的博客 427

openMVS ---dense point cloud(代码理解)

openMVS ---dense point cloud(代码理解)0 代码实现原理1 代码实现步骤1.1 参数传递1.2 loading .mvs数据1.3 稠密重建1.3.0 相关变量及概念1.3.1 ComputeDepthMaps(data) --计算多张深度图1.3.1.1. pre1.3.1.2 为每一张depth map Select view(s) !!!1.3.1.2.1 N neighbors --- global score + filter1.3.1.2.2 MRF ---- t

小rivaaaa的博客 5328

从零到一:微信小程序Camera组件实现高效连续扫码的实战解析

本文详细解析了如何利用微信小程序Camera组件实现高效连续扫码功能,适用于零售仓储、物流配送等场景。通过优化扫码核心机制、防抖处理和图像增强技术,开发者可以突破官方API限制,打造媲美专业扫码枪的流畅体验。文章还提供了性能基准测试和高级功能扩展方案,助力企业提升操作效率。

weixin_29015051的博客 579

使用指南:Django REST Framework 社交OAuth2集成

**Django REST Framework Social OAuth2** 是一个专为 Django REST Framework 设计的扩展模块,它简化了社交账号认证过程。该库允许你在RESTful API中轻松实现OAuth2协议下的社交登录,如Google等,使你的API能够无缝对接各种社交平台的用户验证系统。核心目标是为开发者提供一套便捷的方式来设置REST API中的社交认证,并且与...

gitblog_00548的博客 670

软件测试面试题汇总

软件测试面试题汇总 测试技术面试题 ........................................................................................................................................................................ 5 1、什么是兼容

晴天的专栏 2万+

Django REST framework+Vue 打造生鲜超市(十三)

目录 生鲜超市(一) 生鲜超市(二) 生鲜超市(三) 生鲜超市(四) 生鲜超市(五) 生鲜超市(六) 生鲜超市(七) 生鲜超市(八) 生鲜超市(九) 生鲜超市(十) 生鲜超市(十一) 生鲜超市(十二) 生鲜超市(十三) 代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramew...

weixin_30724853的博客 79

RealSense D455的标定并运行VINS-FUSION

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_40186909的博客 2万+

ADS仿真设计平行定向耦合器学习笔记

ADS仿真设计平行定向耦合器

qq_36521926的博客 1万+

基于Django的音乐匹配社交系统:算法、可视化与全栈实践

推荐系统通过分析用户行为数据,利用协同过滤、内容过滤等算法原理,为用户提供个性化内容,其技术价值在于提升用户体验和平台粘性。在社交网络、电商、内容平台等应用场景中,推荐算法与数据可视化结合,能直观呈现用户偏好与关系网络。本文聚焦于一个集成了智能匹配Agent和社交网络图谱的Python全栈项目,通过Django框架实现了音乐偏好匹配、好友关系管理和多维数据可视化,为开发者提供了从算法落地到工程部署的完整参考。

weixin_33924770的博客 397

11. 使用 HTTP PUT, PATCH 以及 MERGE 请求消费 SAP ABAP OData 服务修改操作的实现及其区别

使用 SAP ABAP SEGW 事物码实现 OData 服务的修改操作时,对于消费端通过 PATCH/MERGE 和 PUT 这三种不同类型的 HTTP 请求触发的场景,我们应该在 UPDATE_ENTITY 方法里用 IF 分支分别进行处理,原因就在于 GET_ENTITY 方法是否在修改处理逻辑的过程中被触发。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2451

基于Django与协同过滤的音乐社交匹配系统:算法、Agent与可视化实践

协同过滤是推荐系统的核心算法之一,它通过分析用户-物品交互矩阵来发现相似性,其原理在于“喜欢相同物品的用户可能具有相似偏好”。这一技术价值在于能够将海量行为数据转化为精准的个性化连接,广泛应用于社交推荐、电商及内容平台。在音乐社交场景中,结合Django框架构建高效后端,并引入Celery Agent实现异步计算与实时匹配,能够有效解决传统社交功能缺乏深度连接的问题。通过ECharts等可视化技术,可将算法生成的用户相似度与社交关系,以关系图谱和雷达图等直观形式呈现,让抽象的“音乐品味距离”变得清晰可见,从

weixin_34353714的博客 299

Calibre:LVS 快速debug short/open技巧

用Fix Suggestion和Short Isolate两种方法debug LVS问题

m0_61544122的博客 7455

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Django的web框架Django Rest_Framework精讲(一)

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用,简称DRF。 在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,把queryset类型数据自动转化为json等可以传到前端的数据类型 不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。

景天科技苑 8848

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Django Rest_Framework(DRF)

Django REST framework中的Serializer使用类来定义,必须直接或间接继承于rest_framework.serializers.Serializer。rest_framework.serializers 是drf提供给开发者调用的序列化器模块里面声明了所有的可用序列化器的基类,常用的有:Serializer 序列化器基类,drf中所有的序列化器类都必须继承于 Serializer。

m0_61810345的博客 2832

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

DjangoRestFramework使用总结

本文主要描述DjangoRestFramework的相关内容,内容比较全,可以当使用手册使用。

记录一些有用的东西 4398

DjangoRESTframework-前端对接

Django项目与前端对接、前端文件访问路径的配置、接口嵌套字段与choice字段的处理

沉觞的博客 589

【django】django RESTFramework前后端分离框架快速入门

"""自定义权限只允许对象的所有者编辑它。""""""判断用户是否有权限访问该对象。"""# 判断当前用户是否是该对象的拥有者。

春天的波菜 4799
上一篇: DjangoRestFramework 使用 django-oauth-toolkit 使网站成为 OAuth Provider(提供方)
PFFFei
博客等级 码龄9年 137粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值