Django中使用第三方登录的示例代码


Posted in Python onAugust 20, 2018

OAuth2.0是什么

 OAuth的英文全称是Open Authorization,它是一种开放授权协议。OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题。

OAuth简单说就是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。

OAuth2.0实现第三方登录的流程

例如你想登录豆瓣去看看电影评论,但你丫的从来没注册过豆瓣账号,又不想新注册一个再使用豆瓣,怎么办呢?不用担心,豆瓣已经为你这种懒人做了准备,用你的qq号可以授权给豆瓣进行登录。流程如下:

第一步:在豆瓣官网点击用qq登录

当你点击用qq登录的小图标时,实际上是向豆瓣的服务器发起了一个 http://www.douban.com/leadToAuthorize 的请求,豆瓣服务器会响应一个重定向地址,指向qq授权登录。

浏览器接到重定向地址 http://www.qq.com/authorize?callback=www.douban.com/callback ,再次访问。并注意到这次访问带了一个参数是callback,以便qq那边授权成功再次让浏览器发起这个callback请求。不然qq怎么知道你让我授权后要返回那个页面啊,每天让我授权的像豆瓣这样的网站这么多。

第二步:跳转到qq登录页面输入用户名密码,然后点授权并登录

qq的服务器接收到了豆瓣访问的authorize,在此例中所给出的回应是跳转到qq的登录页面,用户输入账号密码点击授权并登录按钮后,一定还会访问qq服务器中校验用户名密码的方法,若校验成功,该方法会响应浏览器一个重定向地址,并附上一个code(授权码)。由于豆瓣只关心像qq发起authorize请求后会返回一个code,并不关心qq是如何校验用户的,并且这个过程每个授权服务器可能会做些个性化的处理,只要最终的结果是返回给浏览器一个重定向并附上code即可。

第三步:跳回到豆瓣页面,成功登录

 这一步背后的过程其实是最繁琐的,但对于用户来说是完全感知不到的。用户在QQ登录页面点击授权登陆后,就直接跳转到豆瓣首页了,但其实经历了很多隐藏的过程。

首先接上一步,QQ服务器在判断登录成功后,使页面重定向到之前豆瓣发来的callback并附上code授权码,即 callback=www.douban.com/callback 

页面接到重定向,发起 http://www.douban.com/callback 请求。

豆瓣服务器收到请求后,做了两件再次与QQ沟通的事,即模拟浏览器发起了两次请求。

一个是用拿到的code去换token,另一个就是用拿到的token换取用户信息。最后将用户信息储存起来,返回给浏览器其首页的视图。到此OAuth2.0授权结束。

使用微博进行第三方登录

  • 进入微博开放平台申请应用。
  • 正常情况下,必须经过审核才可以让第三方登录,我们可以先用测试模式来完成。
  • 进入应用中的控制台记下App Key和App Secret。
  • 应用信息中的高级信息中设置授权回调页,测试的时候可以写本地ip,上线一定要写服务器的ip,取消授权回调页选项不填。测试信息中可以添加自己的微博账号用作测试用户。

根据微博的接口写的微博登录的一个demo

#第一步生成一个网页地址,访问后是微博第三方登录的页面,登录会返回一个code(授权码)
def get_auth_url():
  """
    client_id  必填 string 申请应用时分配的App Key。
    redirect_uri  必填 string 授权回调地址,站外应用需与设置的回调地址一致。
  """
  weibo_auth_url = 'https://api.weibo.com/oauth2/authorize'
  redirect_uri = "http://127.0.0.1:8000/complete/weibo/"
  client_id = '29447*****'
  auth_url = weibo_auth_url + "?client_id={client_id}&redirect_uri={re_url}".format(client_id=client_id,re_url=redirect_uri)                                 
  print(auth_url)

#第二步 拿着这个code(授权码)去获得access_token
#第二步运行得到的结果
#'{"access_token":"***********c62892e8c6shqQsB","remind_in":"157679999","expires_in":157679999,"uid":"5020302235","isRealName":"true"}'
def get_access_token(code):
  access_token_url = "https://api.weibo.com/oauth2/access_token"
  import requests
  re_dict = requests.post(access_token_url, data={
    "client_id": "29447*****",
    # App Secret
    "client_secret": "3500dfe8e580c20dfec9828*********",
    "grant_type": "authorization_code",
    "code": code,
    "redirect_uri": "http://127.0.0.1:8000/complete/weibo/",

  })
  pass


# 第三步 拿到access_token后就可以获得这个用户的信息了
def get_user_info(access_token):
  user_url = "https://api.weibo.com/2/users/show.json"
  uid = "5020302235"
  get_url = user_url+"?access_token={at}&uid={uid}".format(at=access_token,uid=uid)
  print(get_url)

if __name__ == '__main__':
  # get_auth_url()
  # get_access_token(code='cef2817996ed1c8f65cebbd69d6378a3')
  get_user_info(access_token='**********2892e8c6shqQsB')

用social_django第三方库来实现第三方登录

github地址,上面有使用说明https://github.com/python-social-auth/social-app-django

(1) 安装

pip install social-auth-app-django

(2)INSTALL_APP中配置

'social_django',

(3)生成表

只需要做migrate,因为migration的文件已经生成好了,数据库中多了五张表,存储第三方登录的信息。

python manage.py migrate

Django中使用第三方登录的示例代码

(4) 添加到AUTHENTICATION_BACKENDS

# settings.py
AUTHENTICATION_BACKENDS = (
  'social_core.backends.weibo.WeiboOAuth2',
  'social_core.backends.qq.QQOAuth2',
  'social_core.backends.weixin.WeixinOAuth2',
  'django.contrib.auth.backends.ModelBackend',
)

(5)配置url

# 第三方登录
  path('', include('social_django.urls', namespace='social'))

 (6)settings里面context_processors

对于template中的用法,向context_processors中加入下面两个

 'social_django.context_processors.backends',
 'social_django.context_processors.login_redirect',

(7)接口

  在微博开放平台里面设置回调url,调试的时候设置成本地的就可以了,上线的时候改成服务器的ip地址

Django中使用第三方登录的示例代码

 (8)APP Secret和App key配置,settings里面

# 第三方登录,里面的值是你的开放平台对应的值
SOCIAL_AUTH_WEIBO_KEY = 'xxxxxxx'
SOCIAL_AUTH_WEIBO_SECRET = 'xxxxxx'

SOCIAL_AUTH_QQ_KEY = 'xxxxxxx'
SOCIAL_AUTH_QQ_SECRET = 'xxxxxxx'

SOCIAL_AUTH_WEIXIN_KEY = 'xxxxxxx'
SOCIAL_AUTH_WEIXIN_SECRET = 'xxxxxxx'

现在浏览器访问:http://127.0.0.1:8000/login/weibo,就可以登录了,我们还需要设置用户微博登录成功后跳转到首页

#登录成功后跳转到首页
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'

(9)修改源码

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

social_core/actions.py中100行左右

return backend.strategy.redirect(url)

修改为

# 修改源码适配drf
  response = backend.strategy.redirect(url)
  payload = jwt_payload_handler(user)
  response.set_cookie("name",user.name if user.name else user.username, max_age=24*3600)
  response.set_cookie("token", jwt_encode_handler(payload), max_age=24*3600)
  return response

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python处理图片之PIL模块简单使用方法
May 11 Python
python中zip()方法应用实例分析
Apr 16 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
Python温度转换实例分析
Jan 17 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
python 杀死自身进程的实现方法
Jul 01 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 #Python
分析python请求数据
Aug 19 #Python
浅谈django orm 优化
Aug 18 #Python
django连接mysql配置方法总结(推荐)
Aug 18 #Python
python画一个玫瑰和一个爱心
Aug 18 #Python
python爱心表白 每天都是浪漫七夕!
Aug 18 #Python
Python实现全排列的打印
Aug 18 #Python
You might like
NT IIS下用ODBC连接数据库
2006/10/09 PHP
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP之预定义接口详解
2015/07/29 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python如何基于redis实现ip代理池
2020/01/17 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
python 下载文件的多种方法汇总
2020/11/17 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
联谊会主持词
2014/03/26 职场文书
学校班班通实施方案
2014/06/11 职场文书
爱心捐书活动总结
2014/07/05 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书