您的位置:首页 > 编程语言 > Python开发

python3Django项目——微博第三方登录

2018-12-14 21:50 127 查看

适合于python3的微博第三方登录的相关代码:

sina.py

[code]import json
import urllib
import re

class OAuth_Base(object):    #基类,将相同的方法写入到此类中
def __init__(self,client_id,client_key,redirect_url):   #初始化,载入对应的应用id、秘钥和回调地址
self.client_id = client_id
self.client_key = client_key
self.redirect_url = redirect_url

def _get(self,url,data):      #get方法
request_url = '%s?%s' % (url,urllib.parse.urlencode(data))
response = urllib.request.urlopen(request_url)
return response.read()

def _post(self,url,data):    #post方法
request = urllib.request.Request(url,data = urllib.parse.urlencode(data).encode(encoding='UTF8'))     #1
response = urllib.request.urlopen(request)
return response.read()

#微博类
class OAuth_WEIBO(OAuth_Base):
def get_auth_url(self):
params = {
'client_id':self.client_id,
# 'response_type':'code',
'redirect_uri':self.redirect_url,
# 'scope':'email',
# 'state':1
}
url = 'https://api.weibo.com/oauth2/authorize?%s&state=/' % urllib.parse.urlencode(params)
return url

def get_access_token(self,code):
params = {
'grant_type':'authorization_code',
'client_id':self.client_id,
'client_secret':self.client_key,
'code':code,
'redirect_uri':self.redirect_url
}
response = self._post('https://api.weibo.com/oauth2/access_token',params)
result = json.loads(response.decode('utf-8'))
self.access_token = result["access_token"]
# self.openid = result["uid"]
return self.access_token

views.py

[code]class OauthSinaloginView(APIView):
"""
构建微博登录跳转链接
"""

def get(self, request):
# 1、创建微博对象
sina = OAuth_WEIBO(client_id=settings.WEIBO_APP_ID, client_key=settings.WEIBO_KEY,
redirect_url=settings.WEIBO_CALLBACK_URL, )

# 4、构建跳转连接
login_url = sina.get_auth_url()

# 5、返回跳转连接
return Response({'login_url': login_url})

class OauthSinaView(APIView):
def get(self, request):
# 1、获取code值
code = request.query_params.get('code', None)

# 2、判断code是否传递过来
if not code:
return Response({'errors': '缺少code值'}, status=400)

# 3、通过code值获取access_token值
# 创建sina对象
sina = OAuth_WEIBO(client_id=settings.WEIBO_APP_ID, client_key=settings.WEIBO_KEY,
redirect_url=settings.WEIBO_CALLBACK_URL, )

access_token = sina.get_access_token(code)
# return Response({'access_token':access_token})

# 4、将access_token赋值给wb_openid
wb_openid = access_token
# 5、判断access_token是否绑定过用户
try:
sina_user = OAuthQQUser.objects.get(wb_openid=wb_openid)
except:
# 6、未绑定,进入到绑定页面完成绑定

tjs = TJS(settings.SECRET_KEY, 300)

wb_openid = tjs.dumps({'wb_openid': wb_openid}).decode()

return Response({'access_token': wb_openid})

else:
# 7、绑定过,则登录成功
# 生成JWT-token值
user = sina_user.user
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)  # 生成载荷部分
token = jwt_encode_handler(payload)  # 生成token

response=Response(
{
'token': token,
'username': user.username,
'user_id': user.id
}
)

return response

# def post(self,request):
#
#     # 绑定保存
#     OAuthQQUser.objects.create(user=user,wb_openid=wb_openid)

def post(self, request):
# 1、获取前端数据
data = request.data

# 2、验证数据
ser = OauthSinaSerializers(data=data)
ser.is_valid()
print(ser.errors)
# 3、绑定保存数据
ser.save()
# 4、返回结果
return Response(ser.data)

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: