OAuth2.0授权认证
oauth2.0是什么?
OAuth(开放授权)是一个开放标准 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方
Oauth2.0的四种授权模式?
https://www.cnblogs.com/Innocent-of-Dabber/p/11009811.html
- 隐式授权模式(Implicit Grant)
- 授权码授权模式(Authorization code Grant)
- 密码模式(Resource Owner Password Credentials Grant)
- 客户端凭证模式(Client Credentials Grant)
微博三方登录
微博登录流程图
接口: 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
}
res_data = {
"code": 0,
"msg": "登陆成功",
"data": data
}
return Response(res_data)
多方式登录
- Views.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