先后端分离抖音第三方受权登陆

2021年09月15日 阅读数:2
这篇文章主要向大家介绍先后端分离抖音第三方受权登陆,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

如今我作的项目须要支持使用抖音帐号登陆,而且能够管理本身的抖音号,因此我须要拿到抖音用户的身份验证 access_token,这篇文章记录一下抖音受权登陆的流程。
前端


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


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

2.用户访问获取受权码的网址,用抖音扫码或者输入抖音帐号密码,进行受权登陆数据库

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

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

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

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

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


有了用户的 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_KEY redirect_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_KEY client_secret = settings.CLIENT_SECRET grant_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到redis set_authorizer_access_token_to_redis(open_id=open_id, authorizer_access_token=access_token, expires_in=expires_in) # 保存用户的refresh_token到redis set_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.id open_id = user.open_id mobile = user.mobile res = { "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



本文分享自微信公众号 - pythonista的平常(gh_fc70d5d98d3f)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。