django第三方微博登录使用流程

1.微博开发平台

  • 注册微博开放平台账号,并进行实名认证。
  • 创建应用(application)
    • 控制台 - 应用基本信息:App keyApp secret
    • 控制台 - 应用高级信息:授权回调地址(不能使用127.0.0.1,换成localhost)
    • 查看API文档
      • 获取授权码code的API文档
      • 获取授权令牌access_token的API文档
        api文档对于开发十分重要,好好利用api文档可以更好地完成代码逻辑。

2.项目代码逻辑

  • 授权登录页:用户输入微博账号和密码扫码
  • 微博颁发授权码给到浏览器:code
    http://localhost:7000/dadashop/templates/callback.html?code=授权码
  • 后端(商家)利用code获取该用户的授权令牌:access_token
  • 执行绑定注册的逻辑
    • 200:微博用户和正式用户已做好绑定,直接跳转到主页(index.html)。
    • 201:微博用户未和正式用户做绑定,执行注册用户并绑定的操作。
  • access_token使用:查看api文档,可以在微博开放平台开放出来的权限接口,获取该用户的一些资源,结合具体业务逻辑实现一些商业化的行为。

3.微博登录流程图

在这里插入图片描述

4.相关视图逻辑代码

class OAuthWeiBoUrlView(View):
    def get(self, request):
        '''获取微博授权登录页的视图'''
        oauth_url = f"https://api.weibo.com/oauth2/authorize?client_id={settings.CLIENT_ID}&redirect_uri={settings.REDIRECT_URI}&response_type=code"
        return JsonResponse({"code": 200, 'oauth_url': oauth_url})


class OAuthWeiBoTokenView(View):
    def get(self, request):
        '''
        获取access_token(接口文档:oauth2/access_token)
        1.获取code:查询字符串
        2.获取access_token(API文档)
        '''
        code = request.GET.get('code')
        url = "https://api.weibo.com/oauth2/access_token"
        data = {
            "client_id": settings.CLIENT_ID,
            "client_secret": settings.CLIENT_SECRET,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": settings.REDIRECT_URI,
        }
        html = requests.post(url=url, data=data).json()
        # print(html)
        '''
        {
            "access_token": "ACCESS_TOKEN",
            "expires_in": 1234,
            "remind_in": "798114",
            "uid": "12341234"
        }'''
        # 绑定注册
        wuid = html.get("uid")
        access_token = html.get("access_token")
        try:
            weibo_user = WeiBoProfile.objects.get(wuid=wuid)
        except Exception as e:
            # 第一次微博登录
            WeiBoProfile.objects.create(wuid=wuid, access_token=access_token)
            return JsonResponse({"code": 201, "uid": wuid})
        # 判定是否和正式用户关联过
        user = weibo_user.user_profile
        if user:
            username = user.username
            token = make_token(username)
            return JsonResponse({"code": 200, "token": token, "username": username})
        else:
            # 微博登录,但关闭了绑定注册页面
            print("わたしは あなたが だいすき")
            return JsonResponse({"code": 201, "uid": wuid})

    def post(self, request):
        '''
        微博用户和正式用户绑定注册视图逻辑
        1.获取请求体数据
        2.存入用户表UserProfile
        3.绑定两个用户:更新微博表外键
        4.签发token,发送激活邮件
        5.返回响应
        '''
        data = json.loads(request.body)
        username = data.get("username")
        password = data.get("password")
        email = data.get("email")
        phone = data.get("phone")
        uid = data.get("uid")
        # 用户名是否可用
        user = UserProfile.objects.filter(username=username)
        if user:
            return JsonResponse({"code": 10112, "error": "用户名已存在~~~"})
        # 创建正式用户并执行绑定关系
        with transaction.atomic():
            sid = transaction.savepoint()
            try:
                user_obj = UserProfile.objects.create(username=username,
                                                      password=md5_encrypt(password),
                                                      email=email,
                                                      phone=phone)
                # 更新外键:一查二改三保存
                weibo_user = WeiBoProfile.objects.get(wuid=uid)
                weibo_user.user_profile = user_obj
                weibo_user.save()
            except Exception as e:
                print("绑定正式用户失败")
                transaction.savepoint_rollback(sid)
                return JsonResponse({"code": 10113, "error": "数据库错误"})
            transaction.savepoint_commit(sid)
        # 发送激活邮件
        verify_url = get_verify_url(username)
        async_send_active_email.delay(email, verify_url)
        # 签发token
        token = make_token(username)
        # 返回数据
        return JsonResponse({"code": 200, "username": username, "token": token})

按照微博的API文档,代码很容易实现!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值