OAuth2.0授权认证

oauth2.0是什么?
OAuth(开放授权)是⼀个开放标准,允许⽤户让第三⽅应⽤访问该⽤户在某⼀⽹站上存储的私密的
资源(如照⽚,视频,联系⼈列表),⽽⽆需将⽤户名和密码提供给第三⽅应⽤。

授权码授权模式(老祖宗)

Oauth2.0的四种授权模式?

https://www.cnblogs.com/Innocent-of-Dabber/p/11009811.html

  • 隐式授权模式(Implicit Grant)

  • 授权码授权模式(Authorization code Grant)

  • 密码模式(Resource Owner Password Credentials Grant)

  • 客户端凭证模式(Client Credentials Grant)

####

微博三方登陆

微博登陆流程图

接口 说明
OAuth2/authorize 请求用户授权Token
OAuth2/access_token 获取授权过的Access Token, UID
  • 在setting.py中配置
WEIBO_APP_ID = '1922536412'
WEIBO_SECRET_KEY = 'ae9fc21b9c9ebca7db0613f4c9faf7df'
  • 在utils/baseview中导入
  1. #utils/Baseview.py
# 微博登录
from rest_framework_jwt.settings import api_settingsdef create_token(user):# 生成jwt_token, user对象,查询结果jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler = api_settings.JWT_ENCODE_HANDLERpayload = jwt_payload_handler(user)token = jwt_encode_handler(payload)return token
  • 创建一个oauthapp应用
  1. 创建oauthapp/model.py中创建表
from django.db import models
from userapp.models import User######  oauthapp/models.py   创建三方登陆用户关联表# Create your models here.
class OauthUser(models.Model):OAUTHTYPE = (('1', 'weibo'),('2', 'weixin'),)uid = models.CharField('三方用户id', max_length=64)user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)oauth_type = models.CharField('认证类型', max_length=10, choices=OAUTHTYPE)

2. #oauthapp/view.py

from urllib.parse import urlencode
import requests
from django.contrib.auth.hashers import make_password
from rest_framework.views import APIView
from rest_framework.response import Response
from oauthapp.models import *
from syl.settings import WEIBO_APP_ID, WEIBO_SECRET_KEY
from userapp.models import User
from utils.BaseView import create_token# 生成前端页面跳转到微博扫码页面
class WeiBoURL(APIView):def post(self, request):# 拼接一个符合微博规范的URLurl = 'https://api.weibo.com/oauth2/authorize?'  # 微博授权的url地址data = {'client_id': WEIBO_APP_ID,  # 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=xxxx&response_type=codereturn Response({'code': '0', 'msg': '成功', 'data': {'url': weibo_url}})# 微博回调接口
class WeiBoCallback(APIView):def post(self, request):code = request.data.get("code")data = {'client_id': WEIBO_APP_ID,'client_secret': WEIBO_SECRET_KEY,'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请求去请求微博准备的信息-----requestsjson_weibo_data = requests.post(url=url, data=data).json()# *******************************************************print(json_weibo_data)# 提取其中有用的信息UIDuid = json_weibo_data.get("uid")# 判断是否获取到UIDif 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 = 1username = 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": 4005, "msg": "参数不全"})# 判断username是否存在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)

3.  oauthapp/urls.py

​
#oauthapp/urls.pyfrom django.contrib import admin
from django.urls import path, includefrom oauthapp.views import *urlpatterns = [path('weibo/', WeiBoURL.as_view()),  # 测试接口获取新浪微博地址path('weibo/callback/', WeiBoCallback.as_view()),  # 微博回调接口path('weibo/binduser/', WeiBoBindUser.as_view()),  # 绑定三方登录用户
]​

4、create_token()

def create_token(user):# 生成jwt_token, user对象,查询结果jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler = api_settings.JWT_ENCODE_HANDLERpayload = jwt_payload_handler(user)token = jwt_encode_handler(payload)return token

多方登陆

from django.contrib.auth.backends import ModelBackendclass PPAuth(ModelBackend):def authenticate(self, request, username=None, password=None, **kwargs):user = models.User.objects.get(Q(username=username) | Q(phone=username) | Q(email=username))if user is not None and user.check_password(password):return user

三方登录---新浪微博登录相关推荐

  1. php rsa2 微博,php新浪通行证登录新浪微博登录模拟登录(浏览器版)2016

    由于需要项目需要管理微博平台内容,集成登录微博管理平台功能,所以在抓取网页基础上探索了一下浏览器模拟登录,已经实现登录功能,采用JQuery和php结合的方式实现的,其中需要注意跨域访问问题,代码如下 ...

  2. php 新浪通行证登录 新浪微博登录 模拟登录 (浏览器版) 2016

    由于需要项目需要管理微博平台内容,集成登录微博管理平台功能,所以在抓取网页基础上探索了一下浏览器模拟登录,已经实现登录功能,采用JQuery和php结合的方式实现的,其中需要注意跨域访问问题,还要注意 ...

  3. Android三方登录之新浪微博登录

    移动端需要尽可能的去减少用户的操作,拿登录来说,使用第三方登录一键登录自然在一定程度上优于传统的短信验证码. 那么集成新浪微博的一键登录需要哪些步骤呢? 1.在新浪后台注册应用,拿到关键ID. 2.集 ...

  4. Android 项目必备(三十七)-->使用友盟集成 QQ、微信、微博等第三方分享与登录

    文章目录 效果图 实战 最近项目需要加入第三方分享和登录功能,之前其他项目的第三方分享和登录一直都使用ShareSDK实现的.为了统一使用友盟的全家桶,所以三方分享和登录也就选择了友盟. 效果图 实战 ...

  5. 新浪微博登录接口实例

    2019独角兽企业重金招聘Python工程师标准>>> 提交的方法: public void getRequestToken()     { OAuthBase oAuth = ne ...

  6. Python爬虫高级之JS渗透登录新浪微博 | 知了独家研究

    小伙伴们看到标题可能会想,我能直接自己登陆把登陆后的cookie复制下来加到自定义的请求头里面不香嘛,为什么非要用python模拟登录的过程?如果我们是长期爬取数据,比如每天早上中午和晚上定时爬取新浪 ...

  7. SpringMVC 整合新浪微博登录 Java SDK

    为什么80%的码农都做不了架构师?>>>    现在很多网站都整合了便捷的第三方登录,如QQ登录.新浪微博.搜狐.网易等,为用户提供不少方便和节约时间.我们可以选择使用JS或SDK实 ...

  8. 新浪微博登录密码加密函数 wsse加密算法说明

    // 新浪微博登录密码加密函数 // password   密码明文 // servertime 提交的参数之一 // nonce      提交的参数之一 // encode_password 输出 ...

  9. scrapy模拟登录新浪微博

    hi: all, scrapy搞模拟登录真的很简单哦,以下均是在你安装scrapy成功的前提下哦. 首先,分析新浪微薄的登录流程,使用抓包工具得到下面的图片: 一般来说,登录主要就是对服务器进行pos ...

最新文章

  1. Android Studio:创建类时,添加作者名和日期
  2. WindowsPhone7开发简单豆瓣网应用程序之界面设计
  3. POJ - 3278 Catch That Cow 简单搜索
  4. java怎么生成字母_java自动生成字母
  5. jdk1.6的项目可以用1.8吗_摩托车链条的保养项目有哪些?可以用高压水枪清洗吗?...
  6. 零氪科技与诺华达成战略合作 共同打造数字化医疗创新模式
  7. fedora下做成liveOS的U盘容量变小问题
  8. HALCON 20.11:如何处理标定助手品质问题
  9. Matlab中imadjust函数的用法
  10. 树——一种数据结构(二)
  11. C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)...
  12. 2019最新资料!共7T
  13. ztree 后台异步加载_Ztree 分批异步加载
  14. WPF窗体更换背景颜色
  15. ASTC纹理压缩格式(Adaptive Scalable Texture Compression)
  16. 美国公立大学计算机排名,【美国大学排名】美国大学计算机专业排名
  17. 路由跟踪在线Tracert工具说明
  18. 牙疼不是病疼起来真要命!教你几个止疼小偏方
  19. 小米3联通电信版解锁(2013062 2013063)刷机包可解账号锁
  20. php 上传apk包到cdn_零基础搭建自己的博客网站和配置CDN设置wordpress篇

热门文章

  1. AXI 总线协议学习笔记(4)
  2. 18个顶级的腾讯qq技巧
  3. matlab人头曲面建模教程,MYAY NURBS人头高级建模教程
  4. Python如何安装pip
  5. 编译原理之语法分析(自底向上)(包含源码)
  6. Java实现欧几里得法求最大公约数GCD
  7. NOIP2017 滚粗记
  8. 头歌平台Python实训答案——函数调用
  9. 思科与华为设备中DHCP配置命令(超详细~~!!)
  10. Python每日一记23分类模型的可信度评估