用django-social-auth 作中國社交網站三方登陸(qq,微博,豆瓣,百度,人人,微信支持)

TODO

我寫這個demo以後, python-social-auth, django-social-auth的做者(一我的),
對這兩個庫進行了比較大的更新,pip裏面甚至下掉了django-social-auth, 0.8.1這個版本,
所以讓demo可以跑起來,你可能須要用個人兩個fork版本.python

python-social_auth一個個人fork版本linux

django-social-auth一個個人fork版本git

我已經在requirements.txt中去掉了這兩個關鍵庫,請手動clone安裝.github

注意安裝順序,須要先裝python-social-auth, 再裝django-social-auth(由於裏面的一些依賴我暫時沒改)web

git clone https://github.com/duoduo369/python-social-auth.git
git clone https://github.com/duoduo369/django-social-auth.git

cd python-social-auth的目錄
pip install -e .
cd django-social-auth的目錄
pip install -e .

因爲這兩個版本還在不按期更新中,所以這個demo過一段時間我會作一次更新,把詳細的使用步驟在寫進去。django

fork版本中提供了裏面原來不支持的一些三方backend,如今中國經常使用的幾個backend基本都有了: 微信,微博,qq,人人,豆瓣,百度windows

Begin

需求項目用的django版本爲1.4.8, 用戶系統採用django默認系統,並且已經有幾萬用戶,改動django的用戶model或者表,django部分作三方登陸在awesome-django中推薦的也是django-social-auth,這兩天試用了一下,寫個demo。api

代碼地址 裏面只添加了必要的requirements,代碼中配置的各個app key都是一個試用的app(沒有過審覈),不用費心思搞我了...微信

social_auth使用方式
session

每一個網站都須要註冊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用戶新建了一個關聯的三方帳戶,此連接沒想出有什麼特殊需求,能夠直接引導到登陸成功頁面

相關文章
相關標籤/搜索