这里我们使用 别人的 第三方包 来 第三方登录 github地址 https://github.com/python-social-auth/social-app-django 大家可以去 看看
安装
pip install social-auth-app-django
如果你用mongodb做为数据库 则安装不同的
pip install social-auth-app-django-mongoengine
django配置
在settings 中 添加它 然后
#添加过后 记得 migrate 由于它 本身 给我们提供了 一些表
INSTALLED_APPS = (
...
'social_django',
...
)
注意 进行 migrate 同时mongodb 跟这也不同 我就 不写了 自己去看看文档
下面是 验证
大家可以去自己的虚拟环境中 social_core 这个包 下面 找到 这个路径 看看 他集成了很多第三方登录 可以自己选择 我们这里只选用了 几个常见的 微博 qq 微信
AUTHENTICATION_BACKENDS = (
'social_core.backends.weibo.WeiboOAuth2', # 使用第三方库 配置 第三方登录
'social_core.backends.qq.QQOAuth2',
'social_core.backends.weixin.WeixinOAuth2', # 微博 qq 微信
'users.views.CustomBackend', # 自定义验证登录
'django.contrib.auth.backends.ModelBackend',
)
集成的各种第三方登录包.PNG
就是在这个app下面 里面还有很多 我只是截取一部分
url配置
urlpatterns = patterns('',
...
# jwt的认证接口 #由于第三方登录 中也有login 所以我们在这需要加上$ 必须以login结束
url(r'^login/$', obtain_jwt_token), ###这句话是我自己加上的 方便 理解 防止 出错
url('', include('social_django.urls', namespace='social'))#把这句放到 url中就行了
...
)
可以自己去 urls中看看他的所有url
同时注意 本身 我们是有 ##login## url了 但是 这个 social_django.urls中 也有 login
所以 我们配置 我们自己的login 时 需要加上$
如果 你是用的 django 而不是 django-restful
<a href="{% url "social:begin" "google-oauth2" %}">Google+</a>
加上这个 就可以使用了 谷歌登录了
但是我们这里使用的是 django-restful 所以不用了
settings中配置 templates
TEMPLATES = [
{
...
'OPTIONS': {
...
'context_processors': [
...
'social_django.context_processors.backends', #加上这两句 就行了
'social_django.context_processors.login_redirect',
...
]
}
}
]
然后就是 Keys and secrets 的配置
SOCIAL_AUTH_WEIBO_KEY = '你的appkey' #如果还需要配置其他的 修改一下 WEIBO 为其他的
SOCIAL_AUTH_WEIBO_SECRET = '你的 secret'
还有就是 回调 到那个网页 也需要 在 settings中配置 我们这里回调懂到首页 可自己修改
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/' #可以自己修改
LOGIN_REDIRECT_URL = '/index/'
然后 就是关键了 由于我们采用了jwt验证模式 所以授权通过后 回调 他并不会给我们 登录用户
所以我们 需要修改一些源码
同样还是在 social_core 复制这个app 到我们的项目目录下
找到 social_core 下的 actions.py 文件 进行修改 添加 验证
from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler
def do_complete(backend, login, user=None, redirect_name='next',
*args, **kwargs):
....
if backend.setting('SANITIZE_REDIRECTS', True):
allowed_hosts = backend.setting('ALLOWED_REDIRECT_HOSTS', []) + \
[backend.strategy.request_host()]
url = sanitize_redirect(allowed_hosts, url) or \
backend.setting('LOGIN_REDIRECT_URL')
response = backend.strategy.redirect(url)
#由于本身重定向回调到我们的页面 却无法登录因为 我们采用了 jwt 的验证模式
#验证是从 cookie 中找 name token 这两个字段来登录用户 所以我们在重定向时 给他设置 cook来登录 同时要注意 设置 过期时间
payload = jwt_payload_handler(user)
# 加密
response.set_cookie('token',jwt_encode_handler(payload),max_age=24*3600)
response.set_cookie('name',user.name if user.name else user.username,max_age=24*3600) #需要过期时间
return response
网友评论