zoukankan      html  css  js  c++  java
  • 我用Django搭网站(2)-QQ登录

    接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。
    流程步骤

    第一步:准备阶段

    打开QQ互联,并登录你的QQ账号。再点击导航上的“应用管理”,创建应用获取appid和appkey。
    创建应用
    创建应用
    其中要注意的是网站名称要和备案的网站名称一致,否则会审核不通过
    填写回调地址
    创建完应用以后就可以获得appid和appkey了,即使审核没通过也没关系,测试也可以使用。
    appid和appkey了

    第二步:具体开发

    • 创建web应用
      创建完成之后,打开models.py文件,编写模型:
    class Users(models.Model):
        qq_openid = models.CharField(max_length=64, null=True)  # QQ的关联OpenID
        description = models.CharField(max_length=200, null=True)  # 个性签名
        nickname = models.CharField(max_length=30, null=True)  # 用户昵称
        head = models.CharField(max_length=100, null=True)  # 用户头像
        sex = models.CharField(max_length=2, null=True)  # 性别
    

    模型用于存储QQ登录返回的openid值。这个openid是与QQ互联创建的应用一一对应。
    在总的urls路由中,加入对应应用路由。

    from django.contrib import admin
    from django.urls import include, path
    
    urlpatterns = [
        path('login/', include('login.urls')),  # 登录模块
    ]
    

    打开对应应用目录下urls.py文件,填写对用的路由:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('oauth/qq/login', views.qq_login),# qq登录
        path('qq/connect/callback.php', views.qq_check),  # 回调路由
    ]
    
    • 开发登录模块
      1.在工程目录settings.py中设置常量
    '''QQ登录常量'''
    QQ_APP_ID = "appid"
    QQ_APP_KEY = "appkey"
    REDIRECT_URI = "回调地址"
    

    2.在对应应用的文件夹下创建qq_oauth.py文件,编辑qq_oauth.py文件:

    import requests
    import json
    
    
    class OAuthQQ:
        def __init__(self, client_id, client_key, redirect_uri):
            self.client_id = client_id
            self.client_key = client_key
            self.redirect_uri = redirect_uri
    
        def get_auth_url(self):
            """获取授权页面的网址"""
            return 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=' + self.client_id + '&state=1&scope=get_user_info&redirect_uri=' + self.redirect_uri
    
        def get_access_token(self, code):
            """根据code获取access_token"""
            url = "https://graph.qq.com/oauth2.0/token"
    
            querystring = {
                "grant_type": "authorization_code",
                "client_id": self.client_id,
                "client_secret": self.client_key,
                "code": code,
                "redirect_uri": self.redirect_uri
            }
    
            response = requests.request("GET", url, params=querystring)
            return response.text.split('=', 3)[1].split('&', 1)[0]
    
        def get_openid(self, access_token):  # 获取用户的openid
            url = "https://graph.qq.com/oauth2.0/me"
    
            querystring = {"access_token": access_token}
    
            response = requests.request("GET", url, params=querystring)
            call_back = str(response.text)[9:-3]
            return json.loads(call_back)['openid']
    
        def get_user_info(self, access_token, qq_openid):  # 获取用户的详细信息
            url = "https://graph.qq.com/user/get_user_info"
    
            querystring = {
                "access_token": access_token,
                "oauth_consumer_key": self.client_id,
                "openid": qq_openid
            }
    
            response = requests.request("GET", url, params=querystring)
    
            return json.loads(response.text)
    

    3.编辑对应应用的文件夹下views.py文件:

    from .qq_oauth import OAuthQQ
    
    
    def qq_login(request):  # QQ第三方登录
        # 获取 得到Authorization Code的地址
        url = OAuthQQ(settings.QQ_APP_ID,
                      settings.QQ_APP_KEY,
                      settings.REDIRECT_URI).get_auth_url()
        # 重定向到授权页面
        return HttpResponseRedirect(url)
    
    
    def qq_check(request):  # 第三方QQ登录,回调函数
        """登录之后,会跳转到这里。需要判断code和state"""
        code = request.GET.get('code', None)
        authqq = OAuthQQ(settings.QQ_APP_ID, settings.QQ_APP_KEY, settings.REDIRECT_URI)
        access_token = authqq.get_access_token(code)  # 获取access_token
        time.sleep(0.05)  # 稍微停一下,给系统调用接口一点时间
    
        qq_openid = authqq.get_openid(access_token)  # 获取用户的openid
    
        if_new_user = models.Users.objects.filter(qq_openid=qq_openid).first()  # 通过openid判断是否是新用户
        if if_new_user is not None:
            #老用户处理逻辑
        else:
            # 新用户业务处理逻辑
    
    总结:

    大体思路是用户点击QQ登录按钮调用qq_login方法然后跳转到登陆授权页面,当用户授权登录之后,QQ会跳转到回调页面,get方式携带code。得到code以后使用get_access_token方法得到access_token。
    得到access_token后拿来获取openid。获取到openid之后,通过openid判断是否是新用户,来调取get_user_info方法获取用户的详细信息。

  • 相关阅读:
    JS高级
    函数作用域面试题
    11.14
    11.13
    Redux知识
    react-router-dom
    react 的三大属性
    vuex
    数组的扩展
    函数作用域和 class
  • 原文地址:https://www.cnblogs.com/caiji/p/9465749.html
Copyright © 2011-2022 走看看