用django-social-auth 做中国社交网站三方登录(qq, weibo, douban)

需求项目用的django版本为1.4.8, 用户系统采用django默认系统,而且已经有几万用户,改动django的用户model或者表,django部分做三方登录在awesome-django中推荐的也是django-social-auth,这两天试用了一下,写个demo。

代码地址 里面只添加了必要的requirements,代码中配置的各个app key都是一个试用的app(没有过审核),不用费心思搞我了…

social_auth使用方式

每个网站都需要注册app,这个就不说了

这里以一个heroku的app为例: http://llovebaimuda.herokuapp.com/

注意social_auth的配置方式不能配置回调地址,因此必须在各大网站将回调地址设置为/你的域名/complete/weibo,
这里就是http://llovebaimuda.herokuapp.com/complete/weibo/,当然不同的网站略有不同。

调试注意! 本地设置hosts

windows %systemroot%\system32\drivers\etc\hosts 需要在开始菜单找到notepad.exe,右键以管理员身份运行,在打开这个文件修改

linux `sudo vi /etc/hosts

将llovebaimuda.herokuapp.com改为本地或者虚拟机的ip, 开发就靠他了。

192.168.9.191 llovebaimuda.herokuapp.com

各个网站配置

新浪

http://open.weibo.com/webmaster,下进入你的app

左侧网站信息基本信息可以看到域名,app key, app secret

左侧接口管理 授权机制找到OAuth2.0 授权设置 授权回调页设置为http://llovebaimuda.herokuapp.com/complete/weibo/

qq

http://connect.qq.com/manage/index,进入你申请开发的app

左侧头像的地方就可以看到 app id, app key

点击信息编辑,找到回调地址,qq回调只要填写域名即可(没有http)llovebaimuda.herokuapp.com

豆瓣

http://developers.douban.com/apikey/, 进入你申请开发的app

概览部分可以看到api key和secrect

豆瓣不需要填写回调地址,不过需要添加测试用户,在左侧测试用户部分添加用户的豆瓣id

social_auth的一些配置

settings

pipeline

SOCIAL_AUTH_PIPELINE = (
    ‘social.pipeline.social_auth.social_details‘,
    ‘social.pipeline.social_auth.social_uid‘,
    ‘social.pipeline.social_auth.auth_allowed‘,
    ‘social_auth.backends.pipeline.social.social_auth_user‘,
    # 用户名与邮箱关联,文档说可能出现问题
    # ‘social_auth.backends.pipeline.associate.associate_by_email‘,
    ‘social_auth.backends.pipeline.misc.save_status_to_session‘,
    ‘social_auth.backends.pipeline.user.create_user‘,
    ‘social_auth.backends.pipeline.social.associate_user‘,
    ‘social_auth.backends.pipeline.social.load_extra_data‘,
    ‘social_auth.backends.pipeline.user.update_user_details‘,
    ‘social_auth.backends.pipeline.misc.save_status_to_session‘,

)

你想用哪几种oauth

AUTHENTICATION_BACKENDS = (
    ‘social_auth.backends.contrib.douban.Douban2Backend‘,
    # 注意这个比较特殊,因为django-social-auth是依赖python-social-auth的
    # python-social-auth==0.1.26,已经包含的qq的backend
    # django-social-auth==0.8.1, 还没包含进来
    # 你需要在django-social-auth/social_auth/backends/contrib中添加一个文件qq.py
    # 就一行
    # from social.backends.qq import QQOAuth2 as QQBackend
    # 然后setup一下就ok
    ‘social_auth.backends.contrib.qq.QQBackend‘,
    ‘social_auth.backends.contrib.weibo.WeiboBackend‘,
    # 必须加,否则django默认用户登录不上
    ‘django.contrib.auth.backends.ModelBackend‘,
)

模板的一些配置

TEMPLATE_CONTEXT_PROCESSORS = (
    ‘django.contrib.auth.context_processors.auth‘,
    # login 在template中可以用 "{% url socialauth_begin ‘douban-oauth2‘ %}"
    ‘social_auth.context_processors.social_auth_by_type_backends‘,
    ‘social_auth.context_processors.social_auth_login_redirect‘,
)

各种重定向连接

SOCIAL_AUTH_LOGIN_URL = ‘/login-url/‘
SOCIAL_AUTH_LOGIN_ERROR_URL = ‘/login-error/‘
SOCIAL_AUTH_LOGIN_REDIRECT_URL = ‘/logged-in/‘
SOCIAL_AUTH_NEW_USER_REDIRECT_URL = ‘/new-users-redirect-url/‘
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = ‘/new-association-redirect-url/‘

各种key, secret

SOCIAL_AUTH_WEIBO_KEY = ‘YOUR KEY‘
SOCIAL_AUTH_WEIBO_SECRET = ‘YOUR SECRET‘

SOCIAL_AUTH_QQ_KEY = ‘YOUR KEY‘
SOCIAL_AUTH_QQ_SECRET = ‘YOUR SECRET‘

SOCIAL_AUTH_DOUBAN_OAUTH2_KEY = ‘YOUR KEY‘
SOCIAL_AUTH_DOUBAN_OAUTH2_SECRET = ‘YOUR SECRET‘

urls

urlpatterns = patterns(‘‘,
    ...
    url(r‘‘, include(‘social_auth.urls‘)),
    ...
)

template

注意实现一下/logout的方法,用django自带的即可

登录
<li><a rel="nofollow" href="{% url socialauth_begin ‘weibo‘ %}">weibo</a></li>
<li><a rel="nofollow" href="{% url socialauth_begin ‘qq‘ %}">qq</a></li>
<li><a rel="nofollow" href="{% url socialauth_begin ‘douban-oauth2‘ %}">douban</a></li>
注销
<a href="/logout" > 注销 </a>

试用

此时User表没有任何用户,登录方式有weibo,douban,qq

In [0]: User.objects.all()
Out[0]: []
In [1]: UserSocialAuth.objects.all()
Out[1]: []

打开http://llovebaimuda.herokuapp.com/,别忘了改host

注意注释或者不注释此句的区别 ‘social_auth.backends.pipeline.associate.associate_by_email‘,

先看不注释,我weibo,qq,douban的邮箱都是一个邮箱

注释掉associate_by_email

初始状态

In [0]: User.objects.all()
Out[0]: []
In [1]: UserSocialAuth.objects.all()
Out[1]: []

用weibo登录, 页面重定向到http://llovebaimuda.herokuapp.com/new-users-redirect-url/

In [2]: User.objects.all()
Out[2]: [<User: 咄咄369>]
In [3]: UserSocialAuth.objects.all()
Out[3]: [<UserSocialAuth: UserSocialAuth object>]

点击注销,在用qq登录,重定向到http://llovebaimuda.herokuapp.com/new-association-redirect-url/

In [4]: User.objects.all()
Out[4]: [<User: 咄咄369>]
In [5]: UserSocialAuth.objects.all()
Out[5]: [<UserSocialAuth: UserSocialAuth object>, <UserSocialAuth: UserSocialAuth object>]

点击注销,在用douban登录,重定向到http://llovebaimuda.herokuapp.com/new-association-redirect-url/

In [6]: User.objects.all()
Out[6]: [<User: 咄咄369>]
In [7]: UserSocialAuth.objects.all()
Out[7]: [<UserSocialAuth: UserSocialAuth object>, <UserSocialAuth: UserSocialAuth object>]

在不注销的情况下点击任何一种登录都会跳转到http://llovebaimuda.herokuapp.com/new-association-redirect-url/

点击注销后,再点击任何一种登录会跳到http://llovebaimuda.herokuapp.com/logged-in/

开启associate_by_email

初始状态

In [0]: User.objects.all()
Out[0]: []
In [1]: UserSocialAuth.objects.all()
Out[1]: []

用weibo登录, 页面重定向到http://llovebaimuda.herokuapp.com/new-users-redirect-url/

In [2]: User.objects.all()
Out[2]: [<User: 咄咄369>]
In [3]: UserSocialAuth.objects.all()
Out[3]: [<UserSocialAuth: UserSocialAuth object>]

点击注销,在用qq登录,重定向到`http://llovebaimuda.herokuapp.com/new-users-redirect-url/‘

In [4]: User.objects.all()
Out[4]: [<User: 咄咄349>, <User: 咄咄>]

In [5]: UserSocialAuth.objects.all()
Out[5]: [<UserSocialAuth: UserSocialAuth object>, <UserSocialAuth: UserSocialAuth object>]

点击注销,在用douban登录,重定向到`http://llovebaimuda.herokuapp.com/new-users-redirect-url/‘

In [4]: User.objects.all()
Out[4]: [<User: 咄咄349>, <User: 咄咄>, <User: 43901973>]

In [5]: UserSocialAuth.objects.all()
Out[5]: [<UserSocialAuth: UserSocialAuth object>, <UserSocialAuth: UserSocialAuth object>, <UserSocialAuth: UserSocialAuth object>]

点击注销, 用任何一种方式登录(以qq为例), 页面跳转到http://llovebaimuda.herokuapp.com/logged-in/

在注销的情况下使用任一一种与4不同的登录方式登录,会出现异常(以豆瓣为例)

AuthAlreadyAssociated at /complete/douban-oauth2/
This douban-oauth2 account is already in use.

各种重定向的思考

SOCIAL_AUTH_LOGIN_URL = ‘/login-url/‘, 暂时没发现什么用

SOCIAL_AUTH_LOGIN_ERROR_URL = ‘/login-error/‘, 登录异常,应该引导用户重新去登录

SOCIAL_AUTH_LOGIN_REDIRECT_URL = ‘/logged-in/‘, 成功登录页面

SOCIAL_AUTH_NEW_USER_REDIRECT_URL = ‘/new-users-redirect-url/‘, django部分新建用户,在这个页面可以引导用户设置邮箱之类的附加信息

SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = ‘/new-association-redirect-url/‘, django用户新建了一个关联的三方账户,此链接没想出有什么特殊需求,可以直接引导到登录成功页面

用django-social-auth 做中国社交网站三方登录(qq, weibo, douban)

时间: 2024-07-30 10:18:39

用django-social-auth 做中国社交网站三方登录(qq, weibo, douban)的相关文章

JSP +MySQL实现网站的登录与注册小案例

为了练手,我就自己试着做了一个网站的登录与注册的小案例.由于没有做美化处理,所以界面并不是很好看. 网站实现的功能如下: 用户首次注册功能 用户登录功能 项目目录展示: 下面我将会分模块展示 注册模块 首先需要一个注册界面,如下register.jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <

Django 编写博客网站的用户管理部分(采用自有的 django.contrib.auth) 2. 登陆登出和用户信息管理

续前Django 编写博客网站的用户管理部分(采用自有的 django.contrib.auth) 1. 注册部分 项目工具:Python 2.7.11  Django 1.10.2  Bootstrap 3.3.0   IDE:eclipse Pydev 1. 由于Django自带auth, 故仅需编写登录登出的url和template即可 urls常见上篇 template代码如下仅供参考: login 1 {% extends "account_base.html" %} 2 3

Django 编写博客网站的用户管理部分(采用自有的 django.contrib.auth) 1. 注册部分

项目工具:Python 2.7.11  Django 1.10.2  Bootstrap 3.3.0   IDE:eclipse Pydev 1. 首先确保settings中已有'django.contrib.auth' 例如: myproject下settings 1 INSTALLED_APPS = [ 2 'account', 3 'django.contrib.admin', 4 'django.contrib.auth', 5 'django.contrib.contenttypes'

django从0到1搭建网站

曾经有人说我前端很水,那么在这一系列文章中我打算把前后端融合在一起来做一次网站的全面重构,希望可以把刚刚入行的同学带上正途 请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址 聊聊工程 如今,数据科学家已经逐渐取代现在的“软件工程师”成为IT行业的主流职业,和“全民都在聊人工智能”一样,可能全部IT工作者都要天天研究算法.琢磨模型.跑数据.调参数.跑数据.调参数,那些被淘汰的“软件工程师”会真的成为民工一样的行业,但是我觉得任何算法都离不开工程实现,再好的模型没有

Snap股市暴涨暴跌,眼红嫉妒的中国社交路在何方?

美国社交平台阅后即焚应用Snap上市后连番大涨,一度达到336亿美金,成为阿里巴巴后美股最大IPO,不过随后在本周一又迎来了暴跌,市值又跌到了275亿美金. 暴涨暴跌的背后究竟是何原因? Snap上市后市值一路飙升,突破300亿美金,远远超过了Twitter和国内的微博,之所以上市后表现如此强劲主要还是得益于以下几个方面. 其一,与Facebook和Twitter不同,Snapchat在90后的年轻用户群体中有着超高的人气,这些年轻用户的活跃度非常高,每天分享图片和视频的用户高达60%,美国本土

Django工程的建立以及小网站的编写

这篇博文会详细的介绍如何创建django工程,介绍我如何做了第一个网站.本文基于windows7安装了python2.7.12,Django1.8.18(LTS)版.采用的IDE为pycharm.建议安装Django的时候采用pip安装,因为可能自己电脑环境缺少哪个包的话,pip能给你安装完全.命令是 1 pip install django==1.8.18 本文的目的是建立一个小网站,能够在测试过程中随时记录所出现的bug,网站命名为Buglist,根据描述,便知道主要的用途就是和数据库交互,

社交网站如何面对 “用户大逃亡”

社区:http://demo.jinhusns.com/?type=xcj 出于对“创新”和“趋势”等因素的追捧,在很多行业专家看来,Twitter.Facebook等相对更新的网络产品在行业表现中总是显得更“酷”,与之相比,AOL.雅虎等前巨头早已经是昨日黄花,不堪一击. 不过时至今日,作为新闻资讯的内容提供商,以AOL.雅虎为首的门户网站仍然在全美占据着相当大的市场份额,尽管增长速度已经不能和硅谷的后辈们相 提并论了,但是其访问流量及用户保有量却是出奇的稳定,鲜见大起大落的势态,仿佛置身事外

django的auth认证,is_authenticate 和装饰器的2个方法,注销的功能,

在django中创建表,会自动创建一些django自带的表,先了解用户认证, 认证登录  先要引用  , from django.contrib import auth 有很多方法, 网站先有登录和认证, authenticate(),提供用户认证,验证用户名和密码是否正确,一般需要username ,password两个关键字参数, 认证信息有效,返回有一个User对象.authrenticate()会在User对象上设置一个属性标识,认证了该用户, 创建一个Book表,然后生成数据库 fro

Django之auth模块(用户认证)登陆组件

auth模块简介 auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象, 而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于数据库中. 除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录 auth里的方法 如果想使用auth模块的方法,必须要先导入auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法