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的一些用法分享
Oct 07 Python
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
python dataframe astype 字段类型转换方法
Apr 11 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
Django时区详解
Jul 24 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 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
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
在MAC上搭建python数据分析开发环境
2016/01/26 Python
python黑魔法之参数传递
2016/02/12 Python
python让列表倒序输出的实例
2018/06/25 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
追悼会子女答谢词
2014/01/28 职场文书
销售员自我评价
2015/03/11 职场文书
校园之声广播稿
2015/08/18 职场文书
HTML+CSS 实现顶部导航栏菜单制作
2021/06/03 HTML / CSS