• 三方授权登陆(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)
  • 相关阅读:
    uni-app开发经验分享四: 实现文字复制到选择器中
    uni-app开发经验分享三: Vuex实现登录和用户信息留存
    uni-app 开发随笔(踩坑记录)
    uni-app开发经验分享二: uni-app生命周期记录
    uni-app开发经验分享一: 多页面传值的三种解决方法
    JS复习笔记一:冒泡排序和二叉树列
    jQ实现图片无缝轮播
    canvas星空背景特效+CSS旋转相册学习
    CSS响应式布局学习笔记(多种方法解决响应式问题)
    LeetCode 76. 最小覆盖子串
  • 原文地址:https://www.cnblogs.com/GlfLss/p/14076347.html
Copyright © 2020-2023  润新知