三方登录---微博
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)
# -*- 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
# -*- 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()), ]

浙公网安备 33010602011771号