现在我做的项目需要支持使用抖音账号登录,并且可以管理自己的抖音号,所以我需要拿到抖音用户的身份验证 access_token,这篇文章记录一下抖音授权登录的流程。

抖音开放平台提供了授权相关的接口和文档说明,大概流程是:

1.用户在我们应用选择抖音登录,前端向后端发起一个 GET 请求,包含stat参数,我给前端返回一个获取授权码的网址。

2.用户访问获取授权码的网址,用抖音扫码或者输入抖音账号密码,进行授权登录

3.用户授权成功之后,抖音会回调我配置的回调 redirect_uri,传回 code 和 stat 参数

4.后端回调函数会用 code等参数请求抖音,得到用户的access_token 和 open_id.

5.后端把用户的 open_id 和 stat参数保存到数据库中,access_token 保存到redis 中

6.后端根据用户信息生成一个用户 token,自己项目的用户认证token,用户open_id 和 token作为 key-value 保存到 redis 中。

7.前端对后端的登录接口进行轮询,传递 stat参数,如果用户表中有 stat 则返回用户的 token。

有了用户的 access_token 和 open_id 就可以操作用户自己的抖音了,包括用户信息,用户的短视频管理等。

下面是代码:

class V1PlatformCodeView(APIView):def get(self, request):"""返回请求抖音授权的页面url:param request::return:"""# uuid 之类的(不允许重复)state = request.query_params.get('state')client_key = settings.CLIENT_KEYredirect_uri = settings.HOST_IP + "v1/user/platform_redirect/"response_type = "code"scope = "user_info,fans.list,following.list,video.create,video.list,video.data,aweme.share,video.delete"url = "https://open.douyin.com/platform/oauth/connect/" \"?client_key={}&response_type={}&scope={}&redirect_uri={}&state={}".format(client_key, response_type,scope,redirect_uri, state)res = {"url": url}return Response(data=res)class V1PlatformRedirectView(APIView):def get(self, request):"""获取access_token:param request::return:"""code = request.query_params.get('code')stat = request.query_params.get('stat')client_key = settings.CLIENT_KEYclient_secret = settings.CLIENT_SECRETgrant_type = "authorization_code"url = "https://open.douyin.com/platform/oauth/connect/oauth/access_token/" \"?client_key={}&client_secret={}&code={}&grant_type={}".format(client_key, client_secret, code,grant_type)r = requests.get(url=url)response = r.json().get("data", {})print("v1/user/platform_redirect/::response", response)open_id = response.get("open_id")expires_in = response.get("expires_in")access_token = response.get("access_token")refresh_token = response.get("refresh_token")# 保存用户的access_token到redisset_authorizer_access_token_to_redis(open_id=open_id, authorizer_access_token=access_token,expires_in=expires_in)# 保存用户的refresh_token到redisset_authorizer_refresh_token_to_redis(open_id=open_id, authorizer_refresh_token=refresh_token)# 判断openid是否存在,存在则更新stat的值,不存在就创建user = BaseUser.objects.update_or_create(defaults={"stat": stat}, open_id=open_id)# 设置 stat 过期时间set_stat_to_redis(stat, expires_in=300)return Response(data={"res": response})class V1DouYinLoginView(APIView):def post(self, request):"""使用抖音账号登录:param request::return:"""stat = request.data.get('stat')# 获取stat过期时间expires_in = from_redis_get_stat(stat)if expires_in < 0:return Response(data={"error": "stat已过期"}, status=status.HTTP_400_BAD_REQUEST)user = BaseUser.objects.filter(stat=stat)if not user.exists():return Response(data={"error": "该用户不存在"}, status=status.HTTP_400_BAD_REQUEST)jwt_token = encode_user_token(user)user_id = user.idopen_id = user.open_idmobile = user.mobileres = {"jwt_token": jwt_token,"id": user_id,"open_id": open_id,"mobile": mobile}return Response(data=res)

参考文档:

https://open.douyin.com/platform/doc/OpenAPI-oauth2

https://blog.csdn.net/I_lost/article/details/104520655

python 抖音第三方登录_前后端分离抖音第三方授权登录相关推荐

  1. python安装环境傻瓜式安装_前后端分离——前端开发环境傻瓜式一步到位 nodejs ruby python nginx 安装搭建配置...

    前端开发环境一步到位 一.准备工作 nodejs安装 安装:next->next.... Ruby安装 安装:next->next.... 需要配置到path:将安装目录复制到环境变量中, ...

  2. python后端开发的缺点_前后端分离优缺点

    前后端分离优缺点 之前有朋友问我:什么是前后端分离.他说北度搜到的都是大篇幅文章,看完还是很懵. 这里我简单总结下,如果有疏漏和不对的地方还请路过的网友指出. 一.先用一张图来解释 二.为什么要前后端 ...

  3. 若依前后端分离如何写移动端接口_前后端分离实践的架构设计

    前后端分离的项目开发策略已经不是什么新鲜东西了,网上介绍这方面的文章非常多.我自己是在14年的时候接触到的,对这种开发策略一直爱不释手,不管新老项目都会首先用前后端分离的思维先去思考一番.从14年到现 ...

  4. 若依前后端分离如何写移动端接口_前后端分离后,如何定义接口规范~

    小Hub领读: 前后端分离的趋势下,该怎么定义规范,来学习学习吧哈! 作者:猿码架构 www.jianshu.com/p/c81008b68350 1. 前言 随着互联网的高速发展,前端页面的展示.交 ...

  5. 你需要来自trustedinstaller的权限才能删除_前后端分离后的权限控制设计方案

    近几年随着react.angular.vue等前端框架兴起,前后端分离的架构迅速流行.但同时权限控制也带来了问题.网上很多前.后端分离权限仅仅都仅仅在描述前端权限控制.且是较简单.固定的角色场景,满足 ...

  6. cors 前后端分离跨域问题_前后端分离之CORS跨域访问踩坑总结

    前言 前后端分离的开发模式越来越流行,目前绝大多数的公司与项目都采取这种方式来开发,它的好处是前端可以只专注于页面实现,而后端则主要负责接口开发,前后端分工明确,彼此职责分离,不再高度耦合,但是由于这 ...

  7. 前后端分离项目如何部署_前后端分离项目,如何解决跨域问题?

    跨域资源共享(CORS)是前后端分离项目很常见的问题,本文主要介绍当SpringBoot应用整合SpringSecurity以后如何解决该问题. 01 什么是跨域问题? CORS全称Cross-Ori ...

  8. thinkphp后台_前后端分离决方案|thinkphpvueadmin 后台接口

    thinkphp-vue-admin 后台接口 |前后端分离决方案 它一套有thinkphp开发集成性后台接口,内置权限管理,api响应,psysh等多功能工具 他的作用 自带登录校验 快速完成数据格 ...

  9. 若依前后端分离框架学习-2:登录过程

    上一篇写了下若依前后端分离框架中前端至弹出登陆界面的过程,本片来详细了解下登录的整个过程.     后端包含ruoyi-admin,ruoyi-common,ruoyi-framework等多个模块, ...

最新文章

  1. SAP WM LPK1 不能把 cross-material control cycles定义成release order parts
  2. android:background=@color/white [create file color.xml at res/values/]
  3. Kafka消费者APi
  4. oracle中偏移,怎么对相同的坐标点偏移?
  5. 计算机网络抓包参考文献,计算机网络课程设计二(网络抓包与分析)
  6. dom4j工具类_基于DOM4J的XML文件解析类
  7. Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)
  8. mysql 堆表_Mysql聚集索引和非聚集索引(堆组织表和索引组织表)
  9. c语言有结构体的200行代码,C语言——结构体(示例代码)
  10. [label][paypal] Paypal 支付页面的语言显示问题
  11. 谭浩强C语言程序设计第五版第七章例题
  12. mysql jdbc 5.6_mysql5.6 jdbc驱动官网下载|
  13. 活动目录备份和灾难恢复之手动备份与非授权还原
  14. 球的体积并(计算几何+球缺)
  15. 保姆级教学!Xcode 配置 OpenGL 环境
  16. 移动信号e经常无服务器,手机信号从4G变成E,是什么情况?移动客服作出解答...
  17. 自动化运维 -- 02 Ansible
  18. 基于python实现crc16 ccitt的校验和
  19. CN_以太网规格和传输介质@双绞线@基带同轴电缆
  20. oracle失效对象是什么意思,Oracle中无效数据库对象的处理方法

热门文章

  1. 基于Python的图像分类 项目实践——图像分类项目
  2. MAC重置密码时,使用Apple ID登录时 下发显示红字“连接到Apple ID”且点击下一步无反应
  3. [Mattermost]安装Docker版
  4. 小程序如何解决文件缓存问题?
  5. 深度优先搜索实现抓牛问题
  6. ggplot2的分面标签和坐标轴位置
  7. ping服务器地址加时间显示,如何对IP地址进行Ping测试
  8. office套件_OfficeSuite v4.9免费专业Office办公套件
  9. 刚找到的OFFICESUITE V3.00注册码
  10. [C/C++]getchar的陷阱