django 中 Oauth2 实现第三方登陆

django 中 Oauth2 实现第三方登陆

 

python网站第三方登录,social-auth-app-django模块,

social-auth-app-django模块是专门用于Django的第三方登录OAuth2协议模块

目前流行的第三方登录都采用了OAuth2协议

 

安装:

pip install social-auth-app-django

 

setting 配置:

添加应用,

 

复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'verify.apps.VerifyConfig',
    'users.apps.UsersConfig',
    'rest_framework',
    'corsheaders',

    'social_django',   
]
复制代码

 

2,输入命令migrate来生成第三方登录需要的表

 注:如无法迁移 可更改 mysql引擎配置 

python manage.py migrate

 

注意新生成的这五张表!!!

3.配置需要的第三方登录模块,settings.py

先找到这个包的位置。

继续配置

复制代码
# 身份验证后端
AUTHENTICATION_BACKENDS = [
    'users.utils.UsernameMobileAuthBackend',

    'social_core.backends.weibo.WeiboOAuth2',  #微博
    'social_core.backends.qq.QQOAuth2',        #qq
    'social_core.backends.weixin.WeixinOAuth2',#微信
    'django.contrib.auth.backends.ModelBackend'      #指定django的modelbackend 类
]
复制代码

配置url 

复制代码
urlpatterns = [
    path('admin/', admin.site.urls),
    #用户认证
    url(r'^',include('verify.urls')),
    #用户信息注册登录
    url(r'^',include('users.urls')),
    #第三方登录
    url('', include('social_django.urls'))
]
复制代码

配置这里,当用户登录的时候,如果用户不存在,会自动在用户表创建用户,并且关联用户信息

复制代码
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
'social_django.context_processors.backends', 'social_django.context_processors.login_redirect' , ], }, }, ]
复制代码

使用第三方参数配置:

# 配置微博开放平台授权(使用其它平台注意更改关键字)
         SOCIAL_AUTH_WEIBO_KEY = '' SOCIAL_AUTH_WEIBO_SECRET = '' # 登录成功后跳转页面 SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'

第三方平台中需要配置回调url

复制代码
# social_django.urls 源码中
urlpatterns = [
    # authentication / association
    # <backend>是一个变量接收要使用登录模块的名称小写
    # 请求URL
    url(r'^login/(?P<backend>[^/]+){0}$'.format(extra), views.auth,
        name='begin'),
    # 回调URL
    url(r'^complete/(?P<backend>[^/]+){0}$'.format(extra), views.complete,
        name='complete'),
    # disconnection
    url(r'^disconnect/(?P<backend>[^/]+){0}$'.format(extra), views.disconnect,
        name='disconnect'),
    url(r'^disconnect/(?P<backend>[^/]+)/(?P<association_id>\d+){0}$'
        .format(extra), views.disconnect, name='disconnect_individual'),
]
复制代码

请求URL构造为:http://域名或者ip/login/使用模块名称小写/

如:http://127.0.0.1:8000/login/weibo/

 

回调URL构造为:http://域名或者ip/complete/使用模块名称小写/

如:http://127.0.0.1:8000/complete/weibo/

回调URL一般需要设置到开放平台的后台

 

前台页面可以调用,请求url

最后 登录测试 查看下表中是否增加 用户数据。

social_auth_usersocialauth 数据表

 

登录成功跳到首页,发现还处于未登录状态,我们需要对源码做修改

social_core/actions.py

原始代码 大约第100行左右 更改

return backend.strategy.redirect(url)

修改为

修改源码适配drf

复制代码
from rest_framework_jwt.serializers import jwt_encode_handler,jwt_payload_handler

response =  backend.strategy.redirect(url)
payload = jwt_payload_handler(user)
response.set_cookie('username',user.username,max_age=24*3600)
response.set_cookie('user_id',user.id,max_age=24*3600)
response.set_cookie('token',jwt_encode_handler(payload),max_age=24*3600)
return response
复制代码

现在就登录后就正常了。qq和微信的登录,一样的操作,只要去开放平台注册应用,其它跟微博登录一样设置就可以了。

posted @   lvye001  阅读(2498)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示