微博三方登陆原理讲解

1. 微博三方登录流程


在这里插入图片描述

https://api.weibo.com/oauth2/authorize? 
client_id=4122644977 
&response_type=code 
&state=study& 
forcelogin=true& 
redirect_uri=https%3A%2F%2Fstudy.163.com%2Fsns%2Fweibo%2FoAuthCallback.htm%3Foaut 
hType%3Dlogin%26returnUrl%3DaHR0cHM6Ly9zdHVkeS4xNjMuY29tL3Byb3ZpZGVyLzQwMDAwMDAwM 
DQ3ODAxMi9pbmRleC5odG0%2FZnJvbT1zdHVkeQ%3D%3D%26nrsstcw%3Dfalse%26nc%3Dtrue### 
https://study.163.com/provider/400000000478012/index.htm?from=study 

1.1 前端获取认证code

  • 1.在Vue页面加载时 动态发送请求获取微博授权url
  • 2.django收到请求的url后 通过微博 应用ID(chient_id)和调回地址(redirect_uri)动态 生成授权url返回给Vue
  • 3.当用户点击上面的url进行扫码,授权成功会 跳转我们的回调界面并附加code参数
  • 4.Vue获取到微博返回的code后,会 将code发送给django后端 (上面的redirect_uri)

1.2 获取微博access_token

  • 后端获取code后,结合client_id、redirect_uri、client_secret参数进行传递,获取微博access_token

1.3 获取微博用户基本信息并保存到数据库

  • 使用获得的access_token调用获取用户基本信息的接口,获取用户第三方平台的基本信息
  • 用户基本信息 保存到数据库,然后关联本地用户,然后将用户信息返回给前端

1.4 生成token给Vue

  • django后端借助微博认证成功后,可以 使用JWT生成token,返回给Vue
  • Vue将token存储到localStorage中,以便用户访问其他页面进行身份验证

2.第三方登录与本地登录的关联(三种情况)


2.1 情况1:本地未登录,第一次登录第三方

此时相当于注册,直接把第三方信息拉取来并注册成本地用户就可以了,并建立本地用户与第三方用户(openid)的绑定关系

2.2 情况2:本地未登录,再次登陆第三方

此时用户已注册,获取到openid后直接找出对应的本地用户即可

2.3 情况3:本地登录,并绑定第三方

这个只要将获取到的openid绑定到本地用户就可以了

3.oauth认证原理


  • OAuth是以开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源,而无需将用户名和密码提供给第三方应用。
  • OAuth允许用户提供一个令牌,而不是用户名和密码来访问她们存放在特定服务提供者的数据。
  • 这个code 如果能出三方换取到数据就证明这个用户是三方真受的用户

4.为什么使用三方登录


  • 服务方希望用户注册,而用户懒得填写注册时的各种信息(主要是为了保证用户的唯一性,各种用户名已占用,密码格式限制)
  • 而像微信,QQ,微博等几乎每个人都会安装的应用中用户肯定会在其中某一个应用中已注册过,证明该用户在已经注册的应用中的唯一性
  • 第三方登录的实质就是在授权时获得第三方应用提供的代表了用户在第三方应用中的唯一性的openid 并将openid储存在第三方服务控制的本地储存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用第三方库requests和BeautifulSoup来实现微博三方登录。以下是一个简单的示例代码: ```python import requests from bs4 import BeautifulSoup # 登录页面的URL login_url = 'https://passport.weibo.com/visitor/visitor' # 构造请求头 headers = { 'User-Agent': 'Mozilla/5. (Windows NT 10.; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58..3029.110 Safari/537.3', 'Referer': 'https://weibo.com/' } # 构造请求参数 params = { 'entry': 'mweibo', 'r': '', 'returntype': 'TEXT', 'url': 'https://weibo.com/', 'prelt': '115', 'ticket': '', 'sudaref': '', 'su': '', 'service': 'miniblog', 'sp': '', 'sr': '192*108', 'encoding': 'UTF-8', 'cdult': '3', 'domain': 'weibo.com', 'pwencode': 'rsa2', 'gateway': '1', 'savestate': '7', 'qrcode_flag': 'false', 'useticket': '1' } # 发送GET请求,获取登录页面 response = requests.get(login_url, headers=headers, params=params) # 解析页面,获取登录所需的参数 soup = BeautifulSoup(response.text, 'html.parser') vk = soup.find('input', attrs={'name': 'vk'})['value'] password_rsa = soup.find('input', attrs={'name': 'password_'}).get('value', '') servertime = soup.find('input', attrs={'name': 'servertime'})['value'] nonce = soup.find('input', attrs={'name': 'nonce'})['value'] rsakv = soup.find('input', attrs={'name': 'rsakv'})['value'] # 构造POST请求参数 post_data = { 'entry': 'mweibo', 'gateway': '1', 'from': '', 'savestate': '7', 'qrcode_flag': 'false', 'useticket': '1', 'pagerefer': '', 'vsnf': '1', 'su': '', 'service': 'miniblog', 'servertime': '', 'nonce': '', 'pwencode': 'rsa2', 'rsakv': '', 'sp': '', 'sr': '192*108', 'encoding': 'UTF-8', 'prelt': '115', 'url': 'https://weibo.com/', 'returntype': 'TEXT' } # 输入微博账号和密码 username = input('请输入微博账号:') password = input('请输入微博密码:') # 对密码进行加密 import rsa import base64 pubkey = '-----BEGIN PUBLIC KEY-----\n' \ 'MIGfMAGCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzv+Zv8zZJzRZ1jJZp9X9vL8fN\n' \ '3yqfZvz8dJWR+1JZzgX9vz8J8WQ2Qz7yq3J2vH8hWJZgJrZJzTYsJ8eB9yJg5y\n' \ 'Mv8GwZg5JZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZzJZz\n' \ 'JZzJZzJZzJZzJZzJZzJZwIDAQAB\n' \ '-----END PUBLIC KEY-----' key = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode()) password = password.encode('utf-8') password = rsa.encrypt(password, key) password = base64.b64encode(password).decode('utf-8') # 更新POST请求参数 post_data.update({ 'su': base64.b64encode(username.encode('utf-8')).decode('utf-8'), 'sp': password, 'servertime': servertime, 'nonce': nonce, 'rsakv': rsakv }) # 发送POST请求,进行登录 response = requests.post(login_url, headers=headers, params=params, data=post_data) # 输出登录结果 if response.status_code == 200: if 'retcode=' in response.text: print('登录成功!') else: print('登录失败!') else: print('请求失败!') ``` 注意:以上代码仅供学习参考,实际使用中需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值