登录接口+三方登录 微博

三方登录微博

  1. 流程图 必会

  2. 生成微博授权URL接口

    1. 创建apps/oauth模块进行oauth认证

      • '''2.1 在apps文件夹下新建应用: oauth'''
        cd syl/apps
        python ../manage.py startapp oauth # 切换到apps文件夹下执行创建命令
        
        '''2.2 添加子路由: oauth/urls.py'''
        from django.urls import path
        from . import views
        urlpatterns = [
        
        ]
        
        '''2.3 在syl/settings.py中添加应用'''
        INSTALLED_APPS = [
        	'oauth.apps.OauthConfig',
        ]
        
        '''2.4 在syl/urls.py主路由中添加'''
        urlpatterns = [
        path('oauth/', include('oauth.urls')),
        
        
    2. 添加子路由: oauth/urls.py

      • urlpatterns = [
        		path('weibo/', views.WeiboUrl.as_view()), 
        		# /oauth/weibo/ 返回微博登录地址
        ]
        
        
    3. syl/settings.py 中配微博地址

      • 
        
    4. 1.3 视图函数: oauth/views.py

      • import requests
        from django.shortcuts import render
        
        # Create your views here.
        from rest_framework.permissions import AllowAny
        from rest_framework.response import Response
        from rest_framework.views import APIView
        from urllib.parse import urlencode
        from .models import OauthUser
        from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
        from apps.user.utils import jwt_response_payload_handler
        from apps.user.models import User
        
        # 生成前端跳转到微博扫码页面的url
        class WeiboUrl(APIView):
            '''
            生成微博的登陆页面路由地址
            https://api.weibo.com/oauth2/authorize? # 微博oauth认证地址
            client_id=4152203033& # 注册开发者id
            response_type=code&
            redirect_uri=http://127.0.0.1:8888/oauth/callback/ # 获取code后将code回
            调给后端地址
            '''
            # 自定义权限类
            permission_classes = (AllowAny,)
        
            def post(self, request):
                url = 'https://api.weibo.com/oauth2/authorize?'  # 微博授权的url地址
                data = {
                    'client_id': '3757426334',  # 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 = 4152203033 & response_type = code & redirect_uri = http://127.0.0.1:8000/api/ weibo_back /
                # return Response({'weibo_url': weibo_url})
                return Response({'code': '0', 'msg': '成功', 'data': {'url': weibo_url}})
        
        
        
    5. 测试生成微博售前URL接口

      • http://192.168.56.100:8888/oauth/weibo/
        
      • 在浏览器访问返回地址即可回到新浪扫码界面

  3. 微博回调接口

    1. oauth/urls.py 中添加路由

      • urlpatterns = [
        	path('weibo/callback/',views.OauthWeiboCallback.as_view()), #/oauth/weibo/callback/
        ]
        
        
    2. oauth/views.py 中添加试图函数

      • 
        # 通过vue前端传入的code,微博身份验证
        class OauthWeiboCallback(APIView):
            # 自定义权限类
            permission_classes = (AllowAny,)
        
            def post(self, request):
                # 接收vue端传过来的code(微博的用户code)
                # 1.使用微博用户code+微博开发者账号信息换取微博的认证access_token
                code = request.data.get('code')
                data = {
                    'client_id': '3757426334',
                    'client_secret': 'c1a95726376bddd06de0143818b35cc6',
                    'grant_type': 'authorization_code',
                    'code': code,
                    'redirect_uri': 'http://127.0.0.1:8888/oauth/callback/',
                }
                url = 'https://api.weibo.com/oauth2/access_token'
                data = requests.post(url=url, data=data).json()  # 拿取请求的返回结果
                # access_token = data.get('uid')  # 获取到的微博token
                weibo_uid = data.get('uid')  # 获取到少码用户的id
                # 2. 根据uid 查询绑定情况
                try:
                    oauth_user = OauthUser.objects.get(uid=weibo_uid, oauth_type='1')
                except Exception as e:
                    oauth_user = None
                # 返回动作, 登录成功/需要绑定用户 type 0 登录成功, 1, 授权成功, 需要绑定
                if oauth_user:
                    # 4. 如果绑定了, 返回token, 登录成功
                    user = oauth_user.user
                    payload = jwt_payload_handler(user)
                    token = jwt_encode_handler(payload)
                    # jwt_response_payload_handler为user模块定义的jwt返回的信息
                    data = jwt_response_payload_handler(token, user)
                    data['type'] = '0'  # 指定为登录成功
                    return Response({'code': 0, 'msg': '登录成功', 'data': data})
                else:
                    # 5. 如果没绑定, 返回标志, 让前端跳转到绑定页面
                    return Response({'code': 0, 'msg': '授权成功', 'data': {'type': '1',
                                                                        'uid': weibo_uid}})
        
    3. oauth/models.py 中添加用户绑定模型

      • from django.db import models
        
        
        
        # Create your models here.
        # 把三方的用户信息,和本地的用户信息进行绑定
        class OauthUser(models.Model):
            OAUTHTYPE = (
                ('1', 'weibo'),
                ('2', 'weixin'),
            )
            uid = models.CharField('三方用户id', max_length=64)
            # 三方用户id
            user = models.ForeignKey('user.User', on_delete=models.CASCADE)
            # 本地用户外键,关联User表
            oauth_type = models.CharField('认证类型', max_length=10, choices=OAUTHTYPE)
            # 1,2 ...
        
        
      • 迁移数据库
        • python manager.py makemigrations
          python manager.py migrate
          


4. ## 微博绑定用户接口

  1. oauth/urls.py 中添加路由

    • urlpatterns = [
      	path('weibo/binduser/',views.OauthWeiboBindUser.as_view()), #/oauth/weibo/callback/
      ]
      
      
  2. oauth/views.py 中添加试图函数

    • 
      class OauthWeiboBindUser(APIView):
          permission_classes = (AllowAny,)
      
          def post(self, request):
      
              # 绑定用户, 1. 已注册用户, 2. 未注册用户
              # 1.1 获取用户名, 密码, weibo_uid
              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': 999, 'msg': '参数不全'})
              # 0.判断是否存在此用户
              try:
                  user = User.objects.get(username=username)
              except Exception as e:
                  user = None
              # 1. 已注册用户
              if user:
                  # 1.2 , 如果存在就验证 密码, 验证通过,就绑定, 返回token,登录成功
                  if user.check_password(password):
                      ou = OauthUser(uid=weibo_uid, user=user, oauth_type='1')
                      ou.save()
                      payload = jwt_payload_handler(user)  # 通过user对象获取到jwt的                payload信息
                      token = jwt_encode_handler(payload)  # 生成token
                      data = jwt_response_payload_handler(token, user)
                      data['type'] = '0'  # 指定为登录成功
                      return Response({'code': 0, 'msg': '登录成功', 'data': data})
                  else:
                      return Response({'code': 999, 'msg': '密码错误'})
              else:
                  # 2. 未注册用户
                  # 2.1 生成新用户, 设置用户名密码, 保存, 然后绑定, 返回token, 登录成功
                  user = User(username=username)
                  user.set_password(password)
                  user.save()
                  ou = OauthUser(uid=weibo_uid, user=user, oauth_type='1')
                  ou.save()
                  payload = jwt_payload_handler(user)
                  token = jwt_encode_handler(payload)
                  data = jwt_response_payload_handler(token, user)
                  data['t y p e'] = '0'  # 指定为登录成功
                  returnResponse({'code': 0, 'msg': '登录成功', 'data': data})
      
      
原文地址:https://www.cnblogs.com/wyx-zy/p/13932292.html