1.安装
pip install social-auth-app-django
2.配置
INSTALLED_APPS=(
...
'social_django',
...
)
3.数据生成,直接migrate,因为源码中的 makemigrtasion 生成的数据库迁移文件已经存在了。会生成5张socia表,不用管
./manage.pymigrate
4.配置中添加
下面是源码,google的第三方验证,不需要添加。
AUTHENTICATION_BACKENDS=(
'social_core.backends.open_id.OpenIdAuth',
'social_core.backends.google.GoogleOpenId',
'social_core.backends.google.GoogleOAuth2',
'social_core.backends.google.GoogleOAuth',
'social_core.backends.twitter.TwitterOAuth',
'social_core.backends.yahoo.YahooOpenId',
...
'django.contrib.auth.backends.ModelBackend',
)
这里是基于微博,QQ,微信的第三方验证
AUTHENTICATION_BACKENDS = (
#自定义设置jwt验证登录时候,可以匹配手机和密码(jwt认证接口默认匹配密码和账户)
'users.views.CustomBackend',
#第三方认证登录配置,微博、微信、QQ
'social_core.backends.weibo.WeiboOAuth2',
'social_core.backends.qq.QQOAuth2',
'social_core.backends.weixin.WeixinOAuth',
'django.contrib.auth.backends.ModelBackend',
)
5.在urls.py中配置URL
urlpatterns = patterns(' ',
...
url(' ',include('social_django.urls', namespace='social'))
...
)
6.setting.py中配置
7.基础配置完后需要在setting.py中设置appkey和回调网站
源码:
SOCIAL_AUTH_TWITTER_KEY='foobar'
SOCIAL_AUTH_TWITTER_SECRET='bazqux'
我的配置:
#第三方登录设置appkey和secret,根据开发平台的不同而不同
SOCIAL_AUTH_WEIBO_KEY = '23xxxxxxx' #微博
SOCIAL_AUTH_TWITTER_SECRET = '2c60B652xxxxcxxxxxxxxx' #微博
SOCIAL_AUTH_QQ_KEY = 'foobar' #QQ
SOCIAL_AUTH_QQ_SECRET = 'bazqux' #QQ
SOCIAL_AUTH_WEIXIN_KEY = 'foobar' #微信
SOCIAL_AUTH_WEIXIN_SECRET = 'bazqux' #微信
8.成功登陆后跳转页面设置
#第三方登录成功后跳转页面,这里跳转的主页
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'
最后:
登录跳转后,会自动生成一个用户,和该第三方用户绑定。
由于项目的不同,不会直接登录,因为第三方框架是将数据存在了session中,而我的项目是用JWT机制保存token来实现登录,所以后续需要修改源码的方法。
1.拷贝源码文件夹(social_core)到extra_apps
2.修改extra_apps/actions.py/def do_complete函数
先导入库
from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler
然后修改def do_complete函数
############### 修改了这个 #############
# return backend.strategy.redirect(url)
response = backend.strategy.redirect(url)
#根据username生成token
payload = jwt_payload_handler(user)
response.set_cookie('name',user.name if user.name else user.username,max_age=24 * 60 * 60) #一定要设置过期时间
response.set_cookie('token',jwt_encode_handler(payload))
return response
最后完成第三方用户登录