我寫這個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
需求項目用的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/
,固然不一樣的網站略有不一樣。
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/
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的一些配置
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'
urlpatterns = patterns('', ... url(r'', include('social_auth.urls')), ... )
注意實現一下/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的郵箱都是一個郵箱
初始狀態
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/
初始狀態
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用戶新建了一個關聯的三方帳戶,此連接沒想出有什麼特殊需求,能夠直接引導到登陸成功頁面