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

现在我做的项目需要支持使用抖音账号登录,并且可以管理自己的抖音号,所以我需要拿到抖音用户的身份验证 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,抖音第三方登录)