三方授权登陆(oauth)

基于Oauth2.0

oauth2.0四种授权模式

隐世授权模式

授权码授权模式(最完善)

密码模式

客户端凭证模式

1.vue请求跳转的微博的url发送给django端

2.django拼接url返回给vue端

3.vue通过url跳转到微博

4.微博完成授权返回code给vue

5.vue将code转发给django

6.django拿code去微博换取token

7.微博返回uid和token给django

8.django拿到uid判断微博用户是否存在本地

8.1存在直接登录  8.2不存在需要绑定本地用户

8.2.1有本地用户直接绑定  8.2.2没有注册后绑定

生成跳转到微博的url

view.py

import requests
from django.contrib.auth.hashers import make_password
from django.shortcuts import render
from urllib.parse import urlencode
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.MyBaseView import create_token
from .models import *

class WeiBoUrl(APIView): def post(self,request): url = 'https://api.weibo.com/oauth2/authorize?' data = { 'client_id': 3023934213, # WEIBO_APP_KEY, 'response_type': 'code', 'redirect_uri': 'http://127.0.0.1:8888/oauth/callback/', } weibo_url = url + urlencode(data) return Response({'code':0,'msg':'成功','data':{'url':weibo_url}})

微博完成授权返回uid和token

import requests
from django.contrib.auth.hashers import make_password
from django.shortcuts import render
from urllib.parse import urlencode
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.MyBaseView import create_token
from .models import *


class WeiBoCallback(APIView):

    def post(self,request):
        code = request.data.get('code')
        data = {
            'client_id':3023934213,
            'client_secret':'104bd94675f786d4be068b7f5f07d2bc',
            'grant_type':'authorization_code',
            'code':code,
            'redirect_uri': 'http://127.0.0.1:8888/oauth/callback/',
        }
        url = 'https://api.weibo.com/oauth2/access_token'
        json_weibo_data = requests.post(url=url,data=data).json()
        uid = json_weibo_data.get('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':9999,'msg':'获取微博信息失败'})
import requests
from django.contrib.auth.hashers import make_password
from django.shortcuts import render
from urllib.parse import urlencode
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.MyBaseView import create_token
from .models import *


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('username')
        if not all([username,password,weibo_uid]):
            return Response({'code':4001,'msg':'参数不齐'})
        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)

本地用户登录

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('username')
if not all([username,password,weibo_uid]):
return Response({'code':4001,'msg':'参数不齐'})
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)
原文地址:https://www.cnblogs.com/GlfLss/p/14076347.html