Python - social-auth-app-django 模块 - 商城项目 第三方方式登录 - 微博
开发准备
开通微博开发者权限
点击这里 进入 微博开放平台
开通后权限后创建应用
创建网页应用, 此处不需要进行审核即可使用测试环境
开发环境信息
此处一些信息是很重要的东西, 比如 App_key 以及 App_Serert
配置互传接口
回调页面也进行设置, 之后要用此接口进行信息回传
文档说明
基于 OAuth2.0 协议进行认证, 点击此文档
重点接口
授权以及token
授权接口使用
点击这里 官方说明
通过阅读官方说明得知是 可以以 get/post 方式进行请求. URL 的生成和支付宝类似, 但是不需要加密
因此会简单很多, 注意看必填字段即可
生成请求地址
直接使用拼接即可生成 url 进行访问
def get_auth_url(): weibo_auth_url = "https://api.weibo.com/oauth2/authorize" redirect_url = "http://127.0.0.1:8000/complete/weibo/" auth_url = weibo_auth_url + "?client_id={0}&redirect_uri={1}".format("3470xxx2804", redirect_url) print(auth_url)
成功请求
根据生成的 url 访问, 会跳转到 微博提供的登录授权页面,然后登录后
会跳转到一个链接地址, 并且参数会提供一串 code
Token接口使用
点击这里查看 官方文档说明
查阅官方说明可见, 此接口方式必须是 post 方式且需要提供之前 授权接口拿到的 token 才可以可以进行使用
发送请求
利用 request 进行 post 的请求
def get_access_token(code="cbf6cccccccccccc6f8e7df1a9dd1c7"): access_token_url = "https://api.weibo.com/oauth2/access_token" import requests re_dict = requests.post(access_token_url, data={ "client_id": "347nnnnn04", "client_secret": "836c9d55a8xxxxxxxa5e2d08b77c8c31bd1", "grant_type": "authorization_code", "code": code, "redirect_uri": "http://127.0.0.1:8000/complete/weibo/" }) pass
请求回传
请求回传中可以拿到一串认证信息 , 包括 uid,以及 access_token , 至此算是授权登录成功, 基于这些信息才可以进行其他必须登录后的访问操作
测试授权后操作验证
编写一个访问用户信息的接口进行生成操作, 用户信息接口官方文档如下 点击这里
访问成功后的回传数据, 可见测试成功
social-auth-app-django
别人造的轮子又大又圆
social-auth-app-django 组件已经集成好了我们上面的那一堆繁琐的操作
github 点这里
官方文档 点这里
安装
From pypi: $ pip install social-auth-app-django
And for MongoEngine ORM: $ pip install social-auth-app-django-mongoengine
注册
Add the application to INSTALLED_APPS setting, for default ORM: INSTALLED_APPS = ( ... 'social_django', ... )
And for MongoEngine ORM: INSTALLED_APPS = ( ... 'social_django_mongoengine', ... )
迁移初始化
更改数据库引擎
使用 social-auth-app-django 组件必须要将数据库的 引擎改为 innodb 不然会无法使用
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "ytshop", 'USER': 'root', 'PASSWORD': "123456", 'HOST': "127.0.0.1", 'OPTIONS': {'init_command': 'SET storage_engine=INNODB;'} } }
迁移数据表
此组件是带有数据表的, 因此需要进行数据库迁移,直接进行 migrate 即可, 源码中自带了 migrations
./manage.py migrate
迁移成功
增加了5张表
配置认证方式
在 settings.py 中配置第三方认证方式
social_core.backends 中涵盖了全世界的主流的平台, 包括知乎豆瓣等
AUTHENTICATION_BACKENDS = ('social_core.backends.weibo.WeiboOAuth2', # 微博 'social_core.backends.weixin.WeixinOAuth2', # 微信 'social_core.backends.qq.QQOAuth2', # qq 'django.contrib.auth.backends.ModelBackend', )
配置 接口
urlpatterns = patterns('', ... url('', include('social_django.urls', namespace='social')) ... )
配置模板
TEMPLATES = [ { ... 'OPTIONS': { ... 'context_processors': [ ... 'social_django.context_processors.backends', 'social_django.context_processors.login_redirect', ... ] } } ]
配置第三方平台相关参数
SOCIAL_AUTH_TWITTER_KEY = 'foobar' SOCIAL_AUTH_TWITTER_SECRET = 'bazqux'
配置参数需要进行更改, TWITTER 改成对应平台的大写
以微博为例 需要输入 key 以及 Secret
SOCIAL_AUTH_WEIBO_KEY = '34XXXXX2804' SOCIAL_AUTH_WEIBO_SECRET = '836c9d55a88XXXX77c8c31bd1'
配置登录成功回调路径
# 第三方登录后自动跳转 SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'
rest-framework 时特殊配置
django 和 rest-framework 的登录流程有所不同,
social-auth-app-django 对 django 的兼容性更好一些,但是对DRF 有所不同
需要进行一定程度的处理, 存放进去用户以及相关的 token
修改位置
需要做手脚的是下图中的部分
最后返回的时候将此代码进行更改为下面的代码
# return backend.strategy.redirect(url)
修改代码
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
payload = jwt_payload_handler(user) reponse = backend.strategy.redirect(url) reponse.set_cookie("name", user.name if user.name else user.username, max_age=24 * 3600) reponse.set_cookie("token", jwt_encode_handler(payload), max_age=24 * 3600) return reponse