微博登陆流程图
|接口|说明 |
|-Oauth2/authorize-|-请求用户授权Token-|
| Oauth2/access_token | 获取授权过的 Access Token, UID|
from urllib.parse import urlencode
import requests
from django.contrib.auth.hashers import make_password
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from code2001B.settings import WEIBO_APP_ID,WEIBO_SECRET_KEY
from oauthapp.models import *
from utils.MyBaseView import create_token
from userapp.models import User
from oauthapp.serializers import OauthUserSer
from utils.MyBaseView import qiniu_token
class WeiBoURL(APIView):
def post(self,request):
#拼接⼀个符合微博规范的URL
url = 'https://api.weibo.com/oauth2/authorize?' # 微博授权的url地址
data = {
'client_id': WEIBO_APP_ID, # WEIBO_APP_KEY,
'response_type': 'code',
'redirect_uri': 'http://127.0.0.1:8888/oauth/callback/', # VUE的回
调,微博后台授权的回调地址
}
#********************************
weibo_url = url + urlencode(data)
# ********************************
#https://api.weibo.com/oauth2/authorize?
client_id=xxxx&response_type=code
return Response({'code': '0', 'msg': '成功', 'data': {'url':
weibo_url}})
class WeiBoCallback(APIView):
def post(self,request):
code = request.data.get("code")
data = {
'client_id': WEIBO_APP_ID,
'client_secret': WEIBO_SECRET_KEY,
'grant_type': 'authorization_code',
'code': code,
'redirect_uri': 'http://127.0.0.1:8888/oauth/callback/',
}
url = "https://api.weibo.com/oauth2/access_token"
#*******************************************************
#需要⽤⼀个http请求去请求微博准备的信息-----requests
json_weibo_data = requests.post(url=url,data=data).json()
# *******************************************************
#提取其中有⽤的信息UID
uid = json_weibo_data.get("uid")
#判断是否获取到UID
if uid:
try:
uid_user = OauthUser.objects.get(uid= uid)
res_data ={
'code':0,
"msg":"授权成功",
"data":{
"type":"0",
"uid":uid,
"username":uid_user.user.username,
"token":create_token(uid_user.user)
}
}
return Response(res_data)
except Exception as e:
res_data = {
'code': 0,
"msg": "授权成功",
"data": {
"type": "1",
"uid": uid,
}
}
return Response(res_data)
else:
return Response({"code":999,"msg":"获取微博信息失败"})
class WeiBoBindUser(APIView):
def post(self,request):
oauth_type = 1
username = request.data.get("username")
password = request.data.get("password")
weibo_uid = request.data.get("weibo_uid")
if not all([username,password,weibo_uid]):
return Response({"code":4005,"msg":"参数不全"})
#判断username是否存在
try:
user = User.objects.get(username=username)
oauthinfo =
OauthUser.objects.create(uid=weibo_uid,oauth_type=oauth_type,
user=user)
data = {
"authenticated" : True,
"id":user.id,
"a":None,
"name":user.nick_name,
"username":username,
"email":user.email,
"token":create_token(user),
"type":0
}
res_data = {
"code":0,
"msg":"登陆成功",
"data":data
}
return Response(res_data)
except Exception as e:
password = make_password(password)
user = User.objects.create(username=username,password=password)
oauthinfo = OauthUser.objects.create(uid=weibo_uid,
oauth_type=oauth_type,
user=user)
data = {
"authenticated": True,
"id": user.id,
"role": None,
"name": user.nick_name,
"username": username,
"email": user.email,
"token": create_token(user),
"type": 0
}
多⽅是登陆
Views.py
res_data = {
"code": 0,
"msg": "登陆成功",
"data": data
}
return Response(res_data)
多方式登录
- View.py
from django.contrib.auth.backends import ModelBackend
class PPAuth(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
user = models.User.objects.get(Q(username=username) |
Q(phone=username) | Q(email=username))
if user is not None and user.check_password(password):
return user