本篇主要介绍如何使用Django的Restful Framework提供第三方登录的API,主要介绍其流程及基本的代码实现。
在学习之前我们需要知道什么是第三方登录 -- 是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目。
实现第三方登录时,我们需要明确QQ提供的开发者文档,即 :
一、QQ登录流程
有了上述的准备工作,我们需要明确进行第三方登录的流程,这里以QQ登录为例:
从上面的时序图我们可以总结以下几步:
- 当用户点击QQ登录按钮时,会向后端请求进行QQ登录的界面,即进行QQ登录的URL。
- 后端实现API,返回根据QQ文档提供的URI和参数,拼接URL返回给前端。 -- API①
- 前端在拿到URL会跳转到QQ登录界面,用户进行登录,登录成功,QQ服务器会根据我们提供的callback地址,跳转到我们项目的回调URL中。
- 提供接口,决定用户是直接登录成功跳转到上一次访问的页面,还跳转到与本项目的账号进行绑定的页面。(取决于用户是否第一次进行QQ登录)。而在这个过程中我们会--》根据回调URL中参数code,向QQ服务器请求授权证书access_token,再根据access_token获取用户的openid及用户头像等。再由openid去数据库查询是否存在,决定跳转页面。 -- API②
- 若用户第一次使用QQ登录,为与本项目账号进行绑定,跳转到绑定页面,让用户进行绑定操作。在进行绑定同时,分为两种情况。 -- API③
- 用户在本项目中的账号已存在,只需进行校验,将openid与用户进行绑定即可。
- 若用户在本项目中账号不存在,需先为用户创建在本项目的账号,在进行绑定。
- 绑定完成,向前端返回用户信息,前端执行页面的调转。
那么流程我们已经分析完成,接下就是数据库的模型类的创建、API的一一的实现。
二、模型类的实现
首先我们明确一下为什么要创建新的模型类,而不是在原有的User的模型类中添加字段,这是由于若后面的第三方登录越来越多,那么我们每次都为User模型类中添加字段,而这些字段通常与用户需要展示的信息关系不大,同时会让数据表显得臃肿。
大致看一下结构如何吧:
在该模型类中我们只创建两个字段:
- 用户 -- 用户模型类对象
- openid -- 用户在QQ服务器的openid。
而在BaseModel只有两个字段,这是有序create_time和update_time可能经常使用,故单独抽取出来进行处理。
from django.db import models class BaseModel(models.Model): """为模型类补充字段""" create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: abstract = True # 说明是抽象模型类, 用于继承使用,数据库迁移时不会创建BaseModel的表
本篇主要进行了第三方登录的流程分析,和数据库模型类的创建。下篇会对每个API进行一一 的实现。
原文地址:https://www.cnblogs.com/littlefivebolg/p/9771722.html
时间: 2024-08-28 10:10:05