三方登录---微博

1,三方登录流程图

 

 

 

微博开放平台设置app和key

 https://www.cnblogs.com/ppzhang/p/12443707.html

from urllib.parse import urlencode

import requests, json
from django.contrib.auth.hashers import make_password
from django.shortcuts import render

# Create your views here.

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from utils.MyBaseVIew import create_token


class WeiBoURL(APIView):
    def post(self, request):
        # 拼接一个符合微博规范的URL
        url = 'https://api.weibo.com/oauth2/authorize?'  # 微博授权的url地址
        data = {
            'client_id': '590702712',
            '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}})


class WeiBoCallback(APIView):
    def post(self, request):
        code = request.data.get('code')

        data = {
            'client_id': '590702712',
            'client_secret': '6084b4a248b7c35e0d9541b57586fb94',
            '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
        weibo_data = requests.post(url=url, data=data).json()  # django请求,相当与前端的axios
        print(type(weibo_data))  # http
        json_weibo_data = weibo_data
        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': 999, 'msg': '获取信息失败'})


class WeiBoBindUser(APIView):
    def post(self, request):
        oauth_type = 1
        username = request.data.get("username")
        password = request.data.get("passwoed")
        weibo_uid = request.data.get("weibo_uid")
        if all([username, password, weibo_uid]):
            return Response({"code": 4005, "msg": "参数不全"})
        try:
            user = User.objects.get(username=username)
            oauthinfo = OauthUser.objects.create(uid=weibo_uid, oauth_type=oauth_type, user=user)
            data = {
                "authenticcated": 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)
        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 = {
                "authenticcated": 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)
view
# -*- coding: utf-8 -*-

from rest_framework_jwt.settings import api_settings
from aliyunsdkcore.request import CommonRequest
from syl.settings import ALY_ACCESSKEY_ID,ALY_ACCESSKEY_SECRET
import json
def create_token(user):
    jwt_payload_handler=api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler=api_settings.JWT_ENCODE_HANDLER
    payload=jwt_payload_handler(user)
    token=jwt_encode_handler(payload)
    return token

#!/usr/bin/env python
#coding=utf-8


from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest





def send_sms(phone,data):

    client = AcsClient(ALY_ACCESSKEY_ID,
                       ALY_ACCESSKEY_SECRET,
                       'cn-hangzhou')

    request = CommonRequest()
    request.set_accept_format('json')
    request.set_domain('dysmsapi.aliyuncs.com')
    request.set_method('POST')
    request.set_protocol_type('https')  # https | http
    request.set_version('2017-05-25')
    request.set_action_name('SendSms')

    request.add_query_param('RegionId', "cn-hangzhou")
    request.add_query_param('PhoneNumbers',phone)
    request.add_query_param('SignName', "美多商城")
    request.add_query_param('TemplateCode', "SMS_205402985")
    request.add_query_param('TemplateParam',data)

    response1 = client.do_action(request)
    # python2:  print(response)
    print(str(response1, encoding='utf-8'))
    res = json.loads(str(response1,encoding='utf-8'))
    if res["Code"]=="OK":
        return True
    else:
        return False
MyBaseView
# -*- coding: utf-8 -*-
from django.urls import path
from .views import *

urlpatterns = [
    path('weibo/', WeiBoURL.as_view()),
    path('weibo/callback/', WeiBoCallback.as_view()),
    path('weibo/binduser/', WeiBoBindUser.as_view()),
]
urls

 

  

 

posted @ 2020-11-05 21:36  wxc_ya  阅读(271)  评论(0)    收藏  举报