所有第三方登录都要先获取第三方应用的Id和秘钥
开发之前,需要前往第三方登录的开发者平台QQ、新浪微博、Github,注册账号并填写信息申请接入,成功后会给你一个ID和秘钥,以后你就通过该ID和秘钥来获取令牌,从而实现第三方登录。申请ID和秘钥时Github不需要审核,很简单,而QQ和新浪微博需要审核,稍微麻烦一点。
获得ID和秘钥后需要在setting中进行设置:
以QQ登录为例:关键点就是获取到QQ的凭证openid,然后将openid跟我们的用户模型联系起来。
若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现。
这是QQ登录的开发者文档:http://wiki.connect.qq.com/准备工作_oauth2-0 第三方登录都有其相应的开发者文档。

使用QQ登录的流程:

新创建一个模型类用于记录用户与第三方登录ID的关联关系:
创建模型的时候可以设置db_index=True来自动创建索引。

from django.db import models
from meiduo_mall.utils.models import BaseModelclass OAuthQQUser(BaseModel):"""QQ登录用户数据"""user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name='用户')openid = models.CharField(max_length=64, verbose_name='openid', db_index=True)class Meta:db_table = 'tb_oauth_qq'verbose_name = 'QQ登录用户数据'verbose_name_plural = verbose_name

其中继承的BaseModel是创建的一个模型类基类,专门用于记录模型的创建更新时间。
这种模型类基类的创建需要添加方法进行说明:

from django.db import modelsclass 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的表

模型类有了之后我们现在就开始完成QQ登录的具体逻辑:
按照一般第三方登录的风格需要完成三个接口的设计:

  1. 取得QQ的授权code
  2. 利用code取得唯一表示openid
  3. 将openid跟用户绑定并登录

一、返回QQ登录网址的视图
目的:访问QQ第三方的登录网址,对用户QQ身份进行校验,校验成功后返回授权code。期间需要利用next参数携带登录成功后的跳转页面的数据。

class QQAuthURLView(APIView):"""获取QQ登录的url    ?next=xxx"""def get(self, request):# 获取next参数next = request.query_params.get("next")# 拼接QQ登录的网址oauth_qq = OAuthQQ(state=next)login_url = oauth_qq.get_login_url()# 返回return Response({'login_url': login_url})

python提供了标准模块urllib可以帮助我们发送HTTP请求,其中的
urllib.parse.urlencode(query):可以将query字典转换为url路径中的查询字符串,用途一般是将得到的返回结果拼接到url中。
urllib.request.urlopen(url, data=None):(爬虫要学的)发送http请求,如果data为None,发送GET请求,如果data不为None,发送POST请求
这一步逻辑是跳转到QQ的第三方登录页面,登录成功后会返回授权code并重定向到callback网址,这个callback网址是在注册QQ开发者是设置好的。

二、QQ登录回调处理
获取url中携带的参数使用“ request.query_params.get(‘参数名’) ” 例如:

    code = request.query_params.get('code')

此处完成逻辑有:

  1. 通过路由携带的参数获取code得到用户数据
  2. 得到openid
  3. 根据openid判断用户是否已经存在不存在则创建
  4. 存在就进一步判断是否已经绑定,如绑定则生成token后直接跳转到指定页面
  5. 没有绑定则跳转到绑定页面(即下一个接口)
    具体视图:
class QQAuthUserView(APIView):"""QQ登录的用户"""def get(self, request):"""获取qq登录的用户数据"""code = request.query_params.get('code')if not code:return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST)oauth = OAuthQQ()# 获取用户openidtry:access_token = oauth.get_access_token(code)openid = oauth.get_openid(access_token)except QQAPIError:return Response({'message': 'QQ服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)# 判断用户是否存在try:qq_user = OAuthQQUser.objects.get(openid=openid)except OAuthQQUser.DoesNotExist:# 用户第一次使用QQ登录token = oauth.generate_save_user_token(openid)return Response({'access_token': token})else:# 找到用户, 生成tokenuser = qq_user.userjwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler = api_settings.JWT_ENCODE_HANDLERpayload = jwt_payload_handler(user)token = jwt_encode_handler(payload)response = Response({'token': token,'user_id': user.id,'username': user.username})return response

三、绑定用户身份接口
主要逻辑使用序列化器实现:

class OAuthQQUserSerializer(serializers.ModelSerializer):"""保存QQ用户序列化器"""sms_code = serializers.CharField(label='短信验证码', write_only=True)access_token = serializers.CharField(label='操作凭证', write_only=True)token = serializers.CharField(read_only=True)mobile = serializers.RegexField(label='手机号', regex=r'^1[3-9]\d{9}$')class Meta:model = Userfields = ('mobile', 'password', 'sms_code', 'access_token', 'id', 'username', 'token')extra_kwargs = {'username': {'read_only': True},'password': {'write_only': True,'min_length': 8,'max_length': 20,'error_messages': {'min_length': '仅允许8-20个字符的密码','max_length': '仅允许8-20个字符的密码',}}}def validate(self, attrs):# 检验access_tokenaccess_token = attrs['access_token']openid = OAuthQQ.check_save_user_token(access_token)if not openid:raise serializers.ValidationError('无效的access_token')attrs['openid'] = openid# 检验短信验证码mobile = attrs['mobile']sms_code = attrs['sms_code']redis_conn = get_redis_connection('verify_codes')real_sms_code = redis_conn.get('sms_%s' % mobile)if real_sms_code.decode() != sms_code:raise serializers.ValidationError('短信验证码错误')# 如果用户存在,检查用户密码try:user = User.objects.get(mobile=mobile)except User.DoesNotExist:passelse:password = attrs['password']if not user.check_password(password):raise serializers.ValidationError('密码错误')attrs['user'] = userreturn attrsdef create(self, validated_data):openid = validated_data['openid']user = validated_data.get('user')mobile = validated_data['mobile']password = validated_data['password']if not user:# 如果用户不存在,创建用户,绑定openid(创建了OAuthQQUser数据)user = User.objects.create_user(username=mobile, mobile=mobile, password=password)OAuthQQUser.objects.create(user=user, openid=openid)# 签发jwt tokenjwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler = api_settings.JWT_ENCODE_HANDLERpayload = jwt_payload_handler(user)token = jwt_encode_handler(payload)user.token = tokenreturn user

Django第三方登录相关推荐

  1. Django第三方登录(QQ登录)

    python编程快速上手(持续更新中-) python实战项目(Django技术点) 1.业务分析 2.OAuth2.0认证获取openid(settings) # QQ登录参数# 我们申请的 客户端 ...

  2. Django项目使用QQ实现第三方登录

    QQ登录,也就是我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现.注册方法可参考链接htt ...

  3. Django项目中使用第三方登录——支付宝登录

    1. 首先在支付宝开放平台(https://open.alipay.com/platform/home.htm)扫码注册信息 选择开发者中心选择研发服务 配置沙盒应用密钥 使用密钥生成工具生成公钥与私 ...

  4. Django搭建个人博客:用django-allauth实现第三方登录

    现在我们已经拥有一个可以进行用户本地登录的博客系统了.如果有人欣赏你的文章,说不定就会注册成为本地用户,并和你好好交流一番. 但头疼的是,用户可能每天都在互联网上浏览很多非常棒的博客,如果每个博客都要 ...

  5. django实现,微博第三方登录超详细

    登录流程 前端获取认证code 在Vue页面加载时动态发送请求获取微博授权url django收到请求的url后,通过微博应用ID(client_id)和回调地址(redirect_uri)动态生成授 ...

  6. python调用qq互联_Django项目中实现使用qq第三方登录功能

    使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ...

  7. python 第三方登录_【Python web 开发】social_django 集成第三方登录

    1.背景: 我们之前写的一些接口仅仅是知道微博授权的一个流程,要把第三方授权登录的用户的user_id 弄到我们的user_profile 中来才是 符合业务的需求的 因此gitbub上已经有一些开源 ...

  8. python实现QQ第三方登录

    应用接入前,首先需进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权.http://wiki.connect.qq.com/__trashed-2 QQ登录 ...

  9. 第三方登录(单点登录)

    一.什么是第三方登录 是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 本文将以QQ登录为例进行详解第三方登录的过程. 二.实现QQ登录 1.准备工作 接入QQ登录前,网站需 ...

最新文章

  1. python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用RdYIBu色彩映射、将不同亮度映射到不同的色彩
  2. golang 切片删除指定内容
  3. linux 几种IPC例子总结
  4. [***]HZOJ 跳房子
  5. shiro ajax权限拦截器,Shiro Ajax请求权限不满足,拦截后解决方案
  6. 大文件分片上传前端框架_无插件实现大文件分片上传,断点续传
  7. Python个 flask 教程地址 做个记录方便以后学习用
  8. CDH报错: 主机的 NTP 服务未同步至任何远程服务器
  9. Django之modelform
  10. 190414每日一句
  11. 实例化Spring容器的两种常用方式
  12. 数字图像处理matlab蔡利梅,数字图像处理:使用MATLAB分析与实现:using MATLAB
  13. 文法二义性与语言二义性
  14. dns劫持是什么意思?常见的劫持有哪些?
  15. E22 LoRa模块透传 定点传输 WOR模式测试与MicroPython应用
  16. Python爬取股票数据存入mysql数据库,获取股票(最新、最高、今开、成交量、成交额、量比、换手率、涨幅等)支持多线程+数据库连接池
  17. P4735 最大异或和 可持久化trie树
  18. python抽奖简单小程序游戏_用Python做个年会抽奖小程序吧
  19. LaTex制作表格之合并单元格
  20. PC+运动控制卡的控制方案

热门文章

  1. C++11 auto自动类型推导
  2. Ubuntu登录界面键盘鼠标失灵
  3. android手机如何设置提高网速,安卓手机网速慢怎么办 安卓手机网速慢解决办法【详解】...
  4. anbox 使用情况_开源Anbox在Linux中运行Android应用
  5. 大屏可视化简介(echarts)
  6. 行业:美团将在快手开放平台上线美团小程序
  7. 计算机专业学生进行职业决策,计算机专业学生职业生涯规划书.doc
  8. 制造业质量管理四大病因
  9. 2018年11月25日ICPC焦作站参赛总结
  10. 读取文件云服务器bcc,读取文件云服务器bcc